17

シェルスクリプトで現在のディレクトリを参照するにはどうすればよいですか?

したがって、同じディレクトリにある別のスクリプトを呼び出すこのスクリプトがあります。

#! /bin/sh

#Call the other script
./foo.sh 

# do something ...

このために私は得た./foo.sh: No such file or directory

だから私はそれを次のように変更しました:

#! /bin/sh

#Call the other script
foo.sh 

# do something ...

ただし、これfooにより、デフォルトでPATHにあるスクリプトが呼び出されます。これは私が望むものではありません。

だから問題は、./シェルスクリプトで参照する構文は何ですか?

4

6 に答える 6

24

両方のスクリプトが同じディレクトリにあり、./foo.sh: No such file or directoryエラーが発生した場合、最も可能性の高い原因は、スクリプトが配置されているディレクトリとは異なるディレクトリから最初のスクリプトを実行したことです。foo.sh最初のスクリプトをどこから呼び出すかに関係なく機能します。

my_dir=`dirname $0`
#Call the other script
$my_dir/foo.sh
于 2012-06-06T01:01:22.160 に答える
7

次のコードはスペースでうまく機能し、bashを必要としません。

#!/bin/sh

SCRIPTDIR="$(dirname "$0")"

#Call the other script
"$SCRIPTDIR/foo.sh"

また、絶対パスを使用する場合は、次のようにすることができます。

SCRIPTDIR=`cd "$(dirname "$0")" && pwd`
于 2014-07-16T01:39:47.570 に答える
1

これはあなたを助けるかもしれません: Unixシェルスクリプトはスクリプトファイルがどのディレクトリにあるかを見つけますか?

しかし、sarnoldが述べたように、「。/」は現在の作業ディレクトリを表します。

于 2012-06-05T22:45:32.867 に答える
1

それをPOSIXにするために:

a="/$0"; a=${a%/*}; a=${a:-.}; a=${a#/}/; BASEDIR=$(cd $a; pwd)

BSDのものを含む多くのボーン互換シェルでテストされました。

私が知る限り、私は著者であり、パブリックドメインにしています。詳細については、 https ://blog.jasan.tk/posix/2017/05/11/posix_shell_dirname_replacementを参照してください。

于 2017-05-11T15:01:39.373 に答える
1

script_dir="${BASH_SOURCE%/*}" # rm the last / and the file name from BASH_SOURCE

$script_dir/foo.sh

参照:上記のAlexCheのコメント。

于 2018-12-02T15:29:40.583 に答える
0

スクリプトを含むディレクトリへのパスにスペースがある場合、受け入れられたソリューションは機能しません。

あなたがbashを使うことができるなら、これは私のために働きました:

#!/bin/bash
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
"${SCRIPTDIR}/foo.sh"
于 2013-12-14T02:22:34.970 に答える