2

次の bash スクリプトがあります (これは、より複雑なスクリプトの簡略化されたバージョンです)。

#!/usr/bin/env bash
set -x

function execute() {
    `$1` # same as $($1), gives "command not found" as do all the following:
    # $1 # or ${1}
    # eval "$1"
    # eval $1

    # This gives "No such file or directory" even though it *is* there...
    #"$1"
}

function runCommand() {
    PATH="${1}"
    execute "chmod 777 ${PATH}"
}

execute "chmod 777 ${1}"
runCommand "$1"

#EOF

実行すると、次の出力が得られます。

+ execute 'chmod 777 build.test-case.sh'
++ chmod 777 build.test-case.sh
+ runCommand build.test-case.sh
+ PATH=build.test-case.sh
+ execute 'chmod 777 build.test-case.sh'
++ chmod 777 build.test-case.sh
./build.test-case.sh: line 5: chmod: command not found

chmod関数が直接呼び出された場合はexecute機能しますが、別の関数から呼び出された場合は失敗しますが、デバッグ出力はまったく同じように見えます...

誰でもこの動作を説明できますか?

4

1 に答える 1

3

問題は、バイナリが存在するディレクトリへのパスを含むPATH変数を上書きしているchmodため、それが見つからないことです。

関数に変数の代わりに別の変数を使用すると、次のようPATHrunCommand()機能するはずです。

function runCommand() {
    VAR="${1}"
    execute "chmod 777 ${VAR}"
}
于 2012-10-02T10:03:54.257 に答える