
ディレクトリをシェルスクリプトディレクトリに変更し、それをエコーする単純なシェルスクリプトを作成しようとしています。
スクリプトは次のとおりです。
#!/bin/bash
# cd '/explicit/path/to/script'
cd $(dirname $0)
echo $(dirname $0)
スクリプトディレクトリに明示的なCDを使用しても、出力は常に次のようになります。
/bin
私は何を見逃していますか?
答え1
スクリプトをインポートするのではなく、スクリプトを実行する必要があります。
/path/to/script.sh
(いいえ.
)。
走るとき
. /path/to/script.sh
$0
現在はシェルであり、おそらく位置があるでしょう/bin
(したがって見える動作)。必ずしもそうではなく/bin/bash
、スクリプトをインポートするとき shebang は何の効果もありません。
ルーカス' 他の点は有効です。引用符を使用せdirname
ずに直接実行する必要がありますecho
。
答え2
この変数は、$0
ユーザーが直接実行するシェルスクリプトを指します。したがって、この内容を含むファイルがある場合
#!/bin/sh
echo "$0"
それをコピーして両方のコピーを実行可能にすると、/bin/my-script
次~/somewhere/my-script-2
の動作を観察できます(私は/bin
あなたの動作であると仮定します$PATH
)。
$ my-script
/bin/my-script
$ ~/somewhere/my-script-2
/home/luc/somewhere/my-script-2
$ cd
$ somewhere/my-script-2
somewhere/my-script-2
$ ../../bin/my-script
../../bin/my-script
$ cd /bin
$ ./my-script
./my-script
など。
インタラクティブシェルで$0
実行されているシェルを指すと、存在する可能性が高くなります/bin
。したがって、上記のシェルスクリプトを取得すると、常にシェルソルバーのパスが表示されます/bin/bash
。これを行うには、両方のスクリプトが実行可能である必要はありません。
$ . my-script
/bin/bash
$ . ~/somewhere/my-script-2
/bin/bash
$ cd
$ . somewhere/my-script-2
/bin/bash
$ . ../../bin/my-script
/bin/bash
$ cd /bin
$ . ./my-script
/bin/bash
その理由は、ソーススクリプトがソーススクリプトと同じプロセスで実行され$0
変更されていないためです($@
更新されたにもかかわらず)。
dirname "$0"
この印刷は、/bin
実行中のファイルがにあること、または対話型セッションまたはソーススクリプトで/bin
実行されており、dirname
使用中のインタプリタが上にあることを意味します/bin
。
その他:
- あなたはそれをする必要はなく、同じことをします
echo "$(dirname "$0")"
。dirname "$0"
- 使用
pwd
get現在のタスクリスト。 - 引用符
$0
とコマンド置換を追加します。そうしないと、問題が発生する可能性があります。cd $(echo a b c)
問題を確認するには、同様のことを試してください。