ネットワークネームスペースとスクリプトが$ PATHを壊したようです。

ネットワークネームスペースとスクリプトが$ PATHを壊したようです。

次のスクリプトを想定します。

$ 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変数を設定しました。とにかく、これは良い一般的な慣行のようです。

関連情報