次のスクリプトを想定します。
$ cat test.sh
#!/bin/bash
echo $PATH
時には次のように進行します。
$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/<user>/.local/bin:/home/<user>/bin
$ sudo ip netns exec blue echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/<user>/.local/bin:/home/<user>/bin
$ ./test.sh
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/<user>/.local/bin:/home/<user>/bin
$ sudo ip netns exec blue ./test.sh
/sbin:/bin:/usr/sbin:/usr/bin
なぜ。それは彼らが私のバイナリをあまり見ることができないことを意味したので、私のスクリプトの生態系を壊した。
私がテストした2つのディストリビューションのうち、Fedora 24がこれを行うことができる唯一のディストリビューションです。 Ubuntu 14.04は$PATH
期待どおりに動作します。
スクリプトに追加してみました。
$ sudo ip netns exec blue PATH=$PATH
PATH=etcetc
ただし、実際のコマンドではないため、エラーが発生します。
正しいアプローチは何ですか?
答え1
常に実行できる2つのタスクは次のとおりです。疑いの余地がないように、コマンドの完全修飾名を使用してください。私のスクリプトでは、環境を外部的に変更するとき(つまり、環境とは無関係に)問題を回避するために、スクリプト内に具体的にPATH変数を設定しました。とにかく、これは良い一般的な慣行のようです。