IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

WSLで始めるUbuntu

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第35回 bashの組み込みコマンドついて知ろう(3) (宮崎悟) 2021年10月

前回は、bashの組み込みコマンドについて説明しました。今回も、bashの組み込みコマンドについて説明します。

compgen/ complete/compopt

コマンドのオプションや引数の補完に関わるコマンドです。後日、詳しく説明します。

continue

for, while, until, select ループの次の繰り返しで、ブロック以降の処理を無視し、ループの次の実行を継続します。シェルスクリプトの説明で、再度説明します。

declare/typeset

変数を宣言したり、変数に属性を与えたりします。シェルスクリプトの説明で、再度説明します。

dirs [+n] [-n] [-clpv]

dirs コマンドは、現在記憶しているディレクトリスタックのリストが表示されます。デフォルトでは、全てのディレクトリ名が空白によって区切られた1行で表示されます。ディレクトリスタックへディレクトリを追加するには、pushd/popd コマンドを使用します。

  • オプション +n (nは 0以上の数値)を指定すると、ディレクトリスタックの 左0から数えて n 番目のディレクトリを表示します。
  • オプション -n (nは 0以上の数値)を指定すると、ディレクトリスタックの 右から数えて n 番目のエントリを表示します。
  • オプション -c を指定すると、ディレクトリスタックの全てのエントリを削除(クリア)します。
  • オプション -l を指定すると、長い形式のリストを表示します。 デフォルトでは、チルダ(~)を使ってホームディレクトリを表しますが、このオプションを指定するとチルダを使用しません。
  • オプション -p を指定すると、1行に1エントリの形でディレクトリスタックを表示します。
  • オプション -v を指定すると、1行に1エントリの形でディレクトリスタックを表示します。 各エントリの前にはスタック内での番号が表示されます。
pushd [-n] [dir]/popd[-n] [+n] [-n]

pushdコマンドは、指定したディレクトリをディレクトリスタックの上位に追加したり、ディレクトリスタックの位置を交換します。通常、pushd はディレクトリスタックの最初のエントリをカレントディレクトリとし、必要があればディレクトリを移動します。

  • オプション *-n を指定すると、ディレクトリ移動をせずに、ディレクトリスタックのみを操作します。
  • オプション -n (nは数値)を指定すると、ディレクトリスタックの最後から n 番目のエントリを一番上にします。
  • オプション +n (nは数値)を指定すると、ディレクトリスタックの最初から n 番目のエントリを一番上にします。
  • ディレクトリ dir を指定すると、dir をディレクトリスタックの最初に追加し、dir をカレントディレクトリとします。

popdコマンドは、ディレクトリスタックからエントリを削除します。引数がない場合は、ディレクトリスタックの最初のエントリを削除とします。削除後にディレクトリスタックの最初のエントリに移動します。

  • オプション -n は、pushd のオプション -n と同じく、ディレクトリを移動しません。
  • オプション -n (nは数値)を指定すると、ディレクトリスタックの最初から n 番目のエントリを削除します。
  • オプション +n (nは数値)を指定すると、ディレクトリスタックの最後から n 番目のエントリを削除します。

pushd/popd コマンドを実行後、必ずdirsコマンドが実行され、終了コードは0になります。pushd/popdが終了コードとして偽を返すのは、以下のパターンです。

  • 不正なオプションを指定したとき
  • ディレクトリスタックが空のとき
  • ディレクトリスタックに存在しないエントリを指定されたとき
  • ディレクトリ変更に失敗した場合

以下は、pushd/popd/dirs コマンドの使用例です。

# 最初のカレントディレクトリは/tmp/aaa です
$ pwd
/tmp/aaa
$ dirs
/tmp/aaa
# pushd で /tmp/bbbに移動します。カレントディレクトリがbbbになります。
$ pushd ../bbb
/tmp/bbb /tmp/aaa
$ pwd
/tmp/bbb
# dirs -vの例です。ディレクトリスタックであることが分かりやすいです。
$ dirs -v
 0  /tmp/bbb
 1  /tmp/aaa
# pushd 単体だと、ディレクトリスタックの0番目と1番目が交換されます。
$ pushd
/tmp/aaa /tmp/bbb
# /tmp/aaa がカレントディレクトリになります。
$ dirs  -v
 0  /tmp/aaa
 1  /tmp/bbb
# 2つ以上pushdで追加可能です。
$ pushd ../ccc
/tmp/ccc /tmp/aaa /tmp/bbb
$ dirs -v
 0  /tmp/ccc
 1  /tmp/aaa
 2  /tmp/bbb
# popd で最初のエントリ/tmp/cccが削除され、/tmp/aaa がカレントディレクトリになります。
$ popd
/tmp/aaa /tmp/bbb
$ dirs -v
 0  /tmp/aaa
 1  /tmp/bbb
# pushd -n で、../cccがディレクトリスタックに追加されます。
$ pushd -n ../ccc
/tmp/aaa ../ccc /tmp/bbb
# このとき、1番目のスタックに追加されます。ディレクトリが相対パスであることに注意してください。
$ dirs -v
 0  /tmp/aaa
 1  ../ccc
 2  /tmp/bbb
# pushd で移動したときに、初めて/tmp/ccc と解釈されます。
$ pushd
/tmp/ccc /tmp/aaa /tmp/bbb
$ dirs -v
 0  /tmp/ccc
 1  /tmp/aaa
 2  /tmp/bbb
# pushd -1 を実行すると、最後から数えて1番目のエントリ(/tmp/aaa)に移動します。
$ pushd -1
/tmp/aaa /tmp/bbb /tmp/ccc
$ dirs -v
 0  /tmp/aaa
 1  /tmp/bbb
 2  /tmp/ccc
# pushd +2 を実行すると、2番目のエントリ(/tmp/ccc)に移動します。
$ pushd +2
/tmp/ccc /tmp/aaa /tmp/bbb
$ dirs -v
 0  /tmp/ccc
 1  /tmp/aaa
 2  /tmp/bbb
# pushdで既存のディレクトリを指定すると、複数のエントリとなります。
$ pushd /tmp/bbb
/tmp/bbb /tmp/ccc /tmp/aaa /tmp/bbb
$ dirs -v
 0  /tmp/bbb
 1  /tmp/ccc
 2  /tmp/aaa
 3  /tmp/bbb
$ pushd ../ddd
/tmp/ddd /tmp/aaa /tmp/ccc /tmp/bbb /tmp/bbb
$ popd -1
$ dirs -v
 0  /tmp/ddd
 1  /tmp/bbb
 2  /tmp/ccc
 3  /tmp/aaa
 4  /tmp/bbb
# popd -0 で、最後から数えて0番目のエントリ(/tmp/aaa)を削除します。
$ popd -0
/tmp/ddd /tmp/bbb /tmp/ccc /tmp/aaa
$ dirs -v
 0  /tmp/ddd
 1  /tmp/bbb
 2  /tmp/ccc
 3  /tmp/aaa
# popd +2で、最初から2番めのエントリ(/tmp/ccc)を削除します。
$ popd +2
/tmp/ddd /tmp/bbb /tmp/aaa
$ dirs -v
 0  /tmp/ddd
 1  /tmp/bbb
 2  /tmp/aaa
# ~をホームディレクトリとして扱います。
$ pushd ~/tmp
~/tmp /tmp/ddd /tmp/bbb /tmp/aaa
$ dirs -v
# cd を使用すると、カレントディレクトリのみが変更されます。
$ cd /tmp
$ dirs -v
 0  /tmp
 1  ~/tmp
 2  /tmp/ddd
 3  /tmp/bbb
 4  /tmp/aaa
# 一番最後のエントリ(/tmp/aaa)に移動します。
$ pushd -0
/tmp/aaa /tmp ~/tmp /tmp/ddd /tmp/bbb
$ dirs -v
 0  /tmp/aaa
 1  /tmp
 2  ~/tmp
 3  /tmp/ddd
 4  /tmp/bbb
# dirs -c で、ディレクトリスタックがクリアされます。
$ dirs -c
$ pwd
/tmp/aaa
$ dirs -v
 0  /tmp/aaa
終わりに

今回は、bashの組み込みコマンドのディレクトリスタック関連について説明しました。pushd/popd/dirs コマンドを活用すると、複数ディレクトリを移動するときに非常に便利になります。次回も、bashの組み込みコマンドについて説明を続けます。次回をお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes