1. ホーム
  2. regex

[解決済み] bashスクリプトで「cd `echo $0 | sed 's/(.***)\/.*/**1/'` 」はどうするのですか?

2022-02-14 15:49:35

質問

を理解しようとしています。 量子エスプレッソの例で書かれたスクリプトです。 . その中に、こんな式がありました。

# run from directory where this script is
cd `echo $0 | sed 's/\(.*\)\/.*/\1/'` # extract pathname

しかし s/\(.*\)\/.*/\1/ を意味します。

どのように解決するのですか?

echo $0 | sed 's/\(.*\)\/.*/\1/'

スクリプトが実行されているフォルダを取得します。

たとえば、次のようなスクリプトを実行している場合 /home/mike/test.sh を実行すると /home/mike/

で、コマンド全体がそのディレクトリに変更されます。

これを試してみてください

echo this is where we started
pwd
cd `echo $0 | sed 's/\(.*\)\/.*/\1/'` # extract pathname
echo now we are here
pwd

そして、スクリプトがあるディレクトリとは別のディレクトリからスクリプトを実行します。

----質問に答えてください ----

sed 's/\(.*\)\/.*/\1/'

はパスの最後の部分を削除します。

これを試す

echo this/is/a/test | sed 's/\(.*\)\/.*/\1/'
echo this/is/a/test/ | sed 's/\(.*\)\/.*/\1/'
echo this/is/a/test.sh | sed 's/\(.*\)\/.*/\1/'

で、それ以降は echo $0 はファイル(現在のスクリプト)を与えるはずなので、式全体はそのスクリプトが保存されているフォルダを与えるはずです。

の動作については、同じ質問に対するこの回答を参照してください。 https://stackoverflow.com/a/50148667/5203563