17

sh を使用して、一部の Windows バッチ ファイルを Unix スクリプトに変換しています。一部の動作がバッチ ファイルで使用可能な %~dp0 マクロに依存しているため、問題があります。

これに相当するshはありますか?実行中のスクリプトが存在するディレクトリを取得する方法はありますか?

4

9 に答える 9

11

(あなたにとって)問題$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 -

これは次のように機能します。

  1. cdコマンドラインから相対パスまたは絶対パスを使用して、スクリプトのディレクトリに移動します。
  2. このディレクトリの絶対パスを取得し、に格納しSCRIPTDIRます。
  3. " " を使用して前の作業ディレクトリに戻りcd -ます。
于 2008-10-16T10:13:28.710 に答える
4

はい、できます!それは引数にあります。:)

見る

${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 のアプローチを使用することをお勧めします。

于 2008-10-16T09:48:02.413 に答える
3

Linux の bash では、次のコマンドを使用してコマンドへのフル パスを取得できます。

readlink /proc/$$/fd/255

ディレクトリを取得するには:

dir=$(dirname $(readlink /proc/$$/fd/255))

それは醜いですが、私はまだ別の方法を見つけていません。

于 2008-10-17T14:37:58.130 に答える
2

別のスクリプトから供給されたスクリプトのパスを見つけようとしていました。そして、それが私の問題でした。ソースのテキストが呼び出し元のスクリプトにコピーされるだけなので、 $0 は常に呼び出し元のスクリプトに関する情報を返します。

$BASH_SOURCE には、それが参照されているスクリプトに関する情報が常に含まれています。スクリプトがソースであっても、元の (ソースされた) スクリプトに正しく解決されます。

于 2008-10-16T15:57:53.303 に答える
1

これは 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
于 2014-06-19T05:40:12.953 に答える
1

これを試して:

${0%/*}
于 2008-10-16T09:49:06.840 に答える
0

以前に $0 を試したことがあります。

ディレクトリ名 $0

「。」を返すだけです。スクリプトが別のスクリプトによって供給されている場合でも:

. ../somedir/somescript.sh

于 2008-10-16T10:02:03.833 に答える