# シェルプログラミングを気軽に使えるようにしたい

**URL:** <https://jlinuxer.org/t/topic/73>\
**Category:** 新米\
**Created:** [2023 年 5 月 17 日午前 4:36 UTC](https://jlinuxer.org/t/topic/73 "2023-05-17T04:36:05Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![icicle](https://jlinuxer.org/user_avatar/jlinuxer.org/icicle/32/10_2.png) [@icicle](https://jlinuxer.org/u/icicle)\
**Post date:** [2023 年 5 月 17 日午前 4:36 UTC](https://jlinuxer.org/t/topic/73/1 "2023-05-17T04:36:05Z")

</div>

# 概要

シェルプログラミングを気軽に使えるようにするために、知恵をお貸しください。

# 原因

「熱意が足りない」と言われれば、それまでなのですが……  
思い当たる節はいくつかあり、心理的な敷居を下げたいと考えています。

## 1. 気軽に実行前の状態に戻せない

一番思い当たる節のある原因です。

例えば、`mv ~/before/a ~/after/`というコマンドを実行したとき、  
「あ、移動するファイルは `a` じゃなくて `b` だった」  
となったとします。

このとき、Nemo Explorer上でファイルを移動していれば、`Ctrl+Z` を使えば一瞬で元に戻りますが、  
シェルプログラミングでは `mv ~/after/a ~/before/` という  
まったく別のコマンドを実行しないと元に戻すことができません（よね？）。

「直前のコマンドを気軽に取り消せたら……」とよく思います。

## 2. 必要な状況に迫られない

テキストの検索や置換、比較、圧縮など、よほど大きなファイルやデータを扱ったりしない限りは、  
今どきのテキストエディタやGUIソフトを使えば、当初の目的は達成できる場面が多いです。

「日常のタスクを自動化したい！」と思い立ったときも、  
一度書いた後はずっと同じスクリプトを使い続けることが多く、  
"日常的にコードを書く"アクションにまで繋がっていません。

「ワンライナーできたらカッコ良さそうだな～」と思いつつも、  
１の原因から、使うコマンドは安全なもの（≒実行前後を気にする必要がないもの）に偏りがちです。

結局、「今この瞬間はなんとかなったからいいか」の繰り返しになっています。

\_\_  
理想は、「よしやるぞ！」で身に付けるのではなく、  
「気付いたら普段使いするようになっていた」に近づけることです。

「オレはこうやって身に着けた」、「この目的意識があればいける」といった、  
初心者に優しい方法論があれば、ぜひよろしくお願いします！

---

<div class="post-metadata">

**Author:** ![ninotchi](https://jlinuxer.org/user_avatar/jlinuxer.org/ninotchi/32/13_2.png) [@ninotchi](https://jlinuxer.org/u/ninotchi)\
**Post date:** [2023 年 5 月 18 日午後 3:06 UTC](https://jlinuxer.org/t/topic/73/2 "2023-05-18T15:06:52Z")

</div>

改めて考えると、必要に迫られてしかスクリプトは組んでいませんでした。  
仕事だとどうしても必要となりますが、覚えよう！という意気込みはなかったかも。

その意気込みがあるだけで次第に自然に使えるようになると思います。

でもファイルを削除するコマンドだけは慎重に。  
実行したら元に戻せません。

ちなみに私はスクリプトの達人ではありません。

先日の失敗  
tar zcf - aaa.qcow2 bbb.qcow2 | ssh [user@192.168.1.2](mailto:user@192.168.1.2) ‘tar zxf - -C /tmp/’  
としなければ行けないところを  
tar zcf aaa.qcow2 bbb.qcow2 | ssh [user@192.168.1.2](mailto:user@192.168.1.2) ‘tar zxf - -C /tmp/’  
としてしまい aaa.qcow2 が上書きされてしまいました・・・（涙）

---

<div class="post-metadata">

**Author:** ![harukamy](https://jlinuxer.org/user_avatar/jlinuxer.org/harukamy/32/8_2.png) [@harukamy](https://jlinuxer.org/u/harukamy)\
**Post date:** [2023 年 5 月 23 日午前 11:07 UTC](https://jlinuxer.org/t/topic/73/3 "2023-05-23T11:07:18Z")

</div>

ちょっと誤解がありそうなので、その点について述べますと  
mvのような処理は限られた場合を除き完全には元に戻すことができない「破壊的処理」です。NemoのCtrl-Zは破壊的処理に対して行った場合、破壊的に逆手順を適用して元に戻そうとします。そのときDeleteが発生すると警告されますが、それ以外では警告を行いません。  
状況により、「元に戻すことを禁じる」あるいは「処理を無視する」といった挙動を示す場合もあるのですが、あまり一貫性がなく、かなり危険です。  
このため、「Nemoなら元に戻せる」という認識自体が誤りで、破壊的に逆手順を適用するならコマンドであっても同じことです。

なお、`mv`がファイル名まで指定した単一のものであれば

```bash
mv !:2 !:1

```

で戻せます。

また、Nemoが逆手順を適用できるのは、ファイル操作ヒストリを持っているためなので、自分でヒストリ保存するコマンドを作れば同じことができます。

2については、「コンピュータで何をしたい」の問題だと思います。  
自動化というのは典型例とされますが、実際はそれほどモチベーションがわくものでもない(というよりSystemdユニットを書くだけで大抵は片付く)ので、面倒なこと、あるいは難しいことをコンピュータにやらせるために書くものですし、そのため1から10まで書く必要もありません。  
例えば`ffmpeg`の長大なオプションを指定する手間を省くためにエイリアスを書くのと、そこから変換や整理までやるスクリプトにするのは同じ話です。

いずれにせよ、習慣づけば当たり前のように日常的に書くようになります。  
あとは変えようとする意思と、今までと違うことをしたがる好奇心の問題だと思います。
