sh を使用して、一部の Windows バッチ ファイルを Unix スクリプトに変換しています。一部の動作がバッチ ファイルで使用可能な %~dp0 マクロに依存しているため、問題があります。
これに相当するshはありますか?実行中のスクリプトが存在するディレクトリを取得する方法はありますか?
sh を使用して、一部の Windows バッチ ファイルを Unix スクリプトに変換しています。一部の動作がバッチ ファイルで使用可能な %~dp0 マクロに依存しているため、問題があります。
これに相当するshはありますか?実行中のスクリプトが存在するディレクトリを取得する方法はありますか?
(あなたにとって)問題$0
は、スクリプト自体の場所ではなく、スクリプトを呼び出すために使用されたコマンドラインに設定されることです。%~dp0
これにより、Windows バッチ ファイルから取得するスクリプトを含むディレクトリのフル パスを取得することが困難になる場合があります。
たとえば、次のスクリプトを考えてみますdollar.sh
。
#!/bin/bash
echo $0
実行すると、次の出力が得られます。
# ./dollar.sh
./dollar.sh
# /tmp/dollar.sh
/tmp/dollar.sh
したがって、スクリプトの完全修飾ディレクトリ名を取得するには、次のようにします。
cd `dirname $0`
SCRIPTDIR=`pwd`
cd -
これは次のように機能します。
cd
コマンドラインから相対パスまたは絶対パスを使用して、スクリプトのディレクトリに移動します。SCRIPTDIR
ます。cd -
ます。はい、できます!それは引数にあります。:)
見る
${0}
それを組み合わせて
{$var%Pattern}
Remove from $var the shortest part of $Pattern that matches the back end of $var.
あなたが欲しいのはただ
${0%/*}
Advanced Bash Scripting Guideをお勧めします (上記の情報の出典元でもあります)。特に、DOS バッチ ファイルからシェル スクリプトへの変換に関する部分は 役に立つかもしれません。:)
私が誤解している場合は、それを「pwd」の出力と組み合わせる必要があるかもしれません。スクリプトが呼び出されたパスのみが含まれているためです。次のスクリプトを試してください。
#!/bin/bash
called_path=${0%/*}
stripped=${called_path#[^/]*}
real_path=`pwd`$stripped
echo "called path: $called_path"
echo "stripped: $stripped"
echo "pwd: `pwd`"
echo "real path: $real_path
ただし、これにはいくつかの作業が必要です。不可能でない限り、Dave Webb のアプローチを使用することをお勧めします。
Linux の bash では、次のコマンドを使用してコマンドへのフル パスを取得できます。
readlink /proc/$$/fd/255
ディレクトリを取得するには:
dir=$(dirname $(readlink /proc/$$/fd/255))
それは醜いですが、私はまだ別の方法を見つけていません。
別のスクリプトから供給されたスクリプトのパスを見つけようとしていました。そして、それが私の問題でした。ソースのテキストが呼び出し元のスクリプトにコピーされるだけなので、 $0 は常に呼び出し元のスクリプトに関する情報を返します。
$BASH_SOURCE には、それが参照されているスクリプトに関する情報が常に含まれています。スクリプトがソースであっても、元の (ソースされた) スクリプトに正しく解決されます。
これは bash シェルで機能するはずです。
dir=$(dirname $(readlink -m $BASH_SOURCE))
テスト スクリプト:
#!/bin/bash
echo $(dirname $(readlink -m $BASH_SOURCE))
テストを実行します。
$ ./somedir/test.sh
/tmp/somedir
$ source ./somedir/test.sh
/tmp/somedir
$ bash ./somedir/test.sh
/tmp/somedir
$ . ./somedir/test.sh
/tmp/somedir
これを試して:
${0%/*}
以前に $0 を試したことがあります。
ディレクトリ名 $0
「。」を返すだけです。スクリプトが別のスクリプトによって供給されている場合でも:
. ../somedir/somescript.sh