bashのeオプションを一時的に無視する

シェルスクリプトを書いていると、エラー処理を書くのが面倒で、とりあえずbashをeオプションで起動しておけばいいや程度に思っていたりします。シェルスクリプト中のどこかでエラーが出ればスクリプト自体を終了してくれるので何かと便利なんですが、途中無視できる程度のエラー処理で止まって困ることもあるので、そこを何とか無視する方法を調べました。まーmanに書いてあったんでちょっと読めば気付くんでしょうが自分は結構時間かかりました。

-e      単純なコマンド (前述の シェルの文法セクションを参照) が 0 でないステータスで終了した場合、即座に終了します。ただし 失敗したコマンドが until または while ループの一部である、 if 文の一部である、 && または ││ リストの一部である、コマンドの返り値が !  で反転されている、のいずれかの場合にはシェルは終了しません。

上の条件に当てはめてしまえばいいだけです。

サンプルとして、以下のようなスクリプト。

 

最初のfalseでは、止まらず次のfalseで止まって、最後のechoは処理されないはずです。

多分自分のシェルがこれになったら泣きたくなる(rbash)

rbash

bashを-rオプションで起動するか、bashのシンボリックリンクがrbashになっているか。

多分大抵のディストリビューションでは、rbashのシンボリックリンクが作られていると思う。

結構古いbashからあった機能らしい。確認した一番古いbashでversion 2.05なのでソートー昔からある。

実際に使ってみると、

 

なんも出来ねー

一応manページによると、以下が出来無いらしい。

  • cd を使ってディレクトリを変更すること
  • SHELL, PATH, ENV, BASH_ENV の値の設定や設定取り消しを行なうこと
  • / を含むコマンド名を指定するこ
  • 組み込みコマンド .  の引き数として / を含むファイル名を指定すること
  • 組み込みコマンド hash に対するオプション -p の引数として / を含むファイル名を指定すること
  • 起動時にシェル環境から関数定義をインポートすること
  • 起動時にシェル環境から SHELLOPTS の値を展開すること
  • リダイレクション演算子 >, >|, <>, >&, &>, >> を使ってリダイレクトを行 なうこと
  • 組み込みコマンド exec を用いて、シェルを別のコマンドに置き換えること
  • 組み込みコマンド enable に対する -f オプションと -d オプションを使って、組み込みコマンドを追加・削除すること
  • 組み込みコマンド command に -p オプションを指定すること
  • set +r や set +o restricted を用いて制限モードを解除すること

かなり厳しい制限だが、共有レンタルサーバなどでユーザにshellを開放する場合は

使えるかもと思った。

chroot+sshが理想なんだろうけど、opensshにパッチあてたり、必要なコマンドをchroot下に用意したりするより

簡単なのではと思う。

特にパッチあては、パッケージ管理から外れるので、sshなんて重要なものでは極力避けたいし。

最近はディストリビューション標準パッケージで、chroot可なものもあるのだろうか。

追加

あれ?

シェルスクリプトで、アルファベット一覧を使いたい時

もっと楽な方法がありました。

シェルスクリプトで、アルファベット一覧を使いたい時がある。

例えば、

「ほげA」

「ほげB」

「ほげC」

なんてディレクトリを作りたい時、数字であればseqを使えばそれで済むのだが

アルファベットだと簡単な方法が分からない。(あるのかもしれないが)

それでたどり着いたのが、以下の方法

 

 

 

ワンライナーだとこんな感じ

 

 

簡単な説明としては、seqで65から90まで出力します。
これは、asciiコードの10進数で、A〜Zになります。

※詳細は、man asciiで確認

次にprintfで16進数にして、文字の前に\xを付けてあげます。

 

これを、printfで%bで出力します。

 

 

と、こんな感じです。

小文字にしたい場合は、97から122にしてあげます。

これでシェルスクリプト時に、アルファベット一覧が使えます。

pythonならこんなの感じ?