web-dev-qa-db-ja.com

bashスクリプトで、名前が変数に保存されているディレクトリに移動するにはどうすればよいですか?

FileCreatorスクリプトを実行しています:

#!/bin/bash

echo "Welcome to the file creator! Please type the directory name:"
read dirName

mkdir $dirName

#Now I want to change directory to that new $dirName that will be run from Terminal.

私の質問は、ターミナルに表示されるこの新しいディレクトリdirNameへのパスを変更する方法です。したがって、最後に、このスクリプトを実行すると、パスは/home/my_user_name/SCRIPTS/dirNameになります...

ただの提案ですか? :)

3

cdコマンド 変更 現在のディレクトリ 。詳細については、help cdを実行してください。

dirNameがシェル 変数 で、そこに移動したいディレクトリの名前が含まれている場合、

cd -- "$dirName"

そこに行きます。たとえば、/home/my_user_name/SCRIPTSで開始し、変数dirNameにテキストfooが含まれている場合、そのコマンドは/home/my_user_name/SCRIPTS/fooに移動します。

ユーザーがスクリプトを実行する場所に関係なく、dirName/home/my_user_name/SCRIPTSの-​​ 相対パス として常に解釈する場合は、次を使用します。

cd -- "/home/my_user_name/SCRIPTS/$dirName"

先頭の--引数と引用符の使用 に気付いたかもしれません:

  • スクリプトで、ユーザー入力を arguments として受け入れるコマンドに-または--で始まる options を渡す場合、通常は次のことをお勧めします。 --オプション を最初に渡します。ファイル名引数を受け入れるほとんどのコマンドは、この構文をサポートしています(ただし、常に確認する必要があります)。これは、後続のすべての引数がオプションではなくファイル名として解釈されることを意味します。

    これを理解するには、ls -lを実行し、ls -- -lを実行してみてください。通常、コマンドを手動で入力するときに--引数を使用する必要はありません。しかし、非サニタイズされた入力の値をコマンドに渡すスクリプトでは、頻繁に使用されます。

  • 両方のコマンドで、 二重引用符"")を使用しました。これは通常、ファイル名を含む変数を展開するときに必要なものです。

    引用符をまったく使用しなかった場合と同様ですが、 単一引用符'')とは異なり、二重引用符は パラメーター展開 を許可します。そのため、$dirNamereadコマンドによって割り当てられた値に展開されるのを防ぎません。ただし、引用符をまったく使用せず、単一引用符と同様に、二重引用符は Word splitting を防ぎます。そうすれば、変数に空白文字(または IFSに存在する文字設定されている場合 )が含まれている場合でも、変数は適切に機能します。

    Bash Reference Manual.1.2 Quoting も参照してください。

mkdirコマンド、およびおそらく--でも二重引用符を使用することをお勧めします。

mkdir -- "$dirName"

ただし、シェルスクリプトで現在のディレクトリを変更しても、 callingプロセス の現在のディレクトリは変更されません。かわった。これは仕様によるものです(すべてではありませんが、Windowsを含むほとんどのオペレーティングシステムに適用されます)。プログラムが別のプログラムを実行するとき、自分自身の現在のディレクトリが変更されることを期待していません。

すべてのプログラムには、独自の environment と独自の現在のディレクトリがあります。新しいプログラムを開始すると、それを開始したプログラムからこれを継承しますが、独自のコピーがあります。 子プロセス が現在のディレクトリを変更する場合、つまりnotは親プロセスに反映されます。

多くの場合、呼び出し元のディレクトリを変更する場合、正しいアプローチはデザインを再検討することです。これは本当に必要ですか?

基本的に、呼び出し元のディレクトリを変更するのが合理的である唯一の状況は、スクリプトが実際に呼び出し元によって直接実行されるコマンドのリストにすぎない場合です。その場合は、 source実行する代わりにスクリプトを実行できます 。たとえば、次のコマンドを使用して現在スクリプトを実行しているとします。

./my_script

次に、代わりにsourceそれを次のように使用できます:

. ./my_script

この代替構文もサポートされています。

source ./my_script

Bashシェル.sourceの両方をサポートします builtins 、これらは同等です。 (詳細については、help .またはhelp sourceを実行してください。)

これにより、スクリプト内のすべてのコマンド 現在のシェルで実行される が、新しいシェルではなく(実際にrunシェルスクリプト)。

8
Eliah Kagan