다음 스크립트를 가정합니다.
$ 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
왜. 그것은 그들이 내 바이너리를 많이 볼 수 없다는 것을 의미했기 때문에 내 스크립팅 생태계를 깨뜨렸습니다.
제가 테스트한 두 배포판 중 Fedora 24가 이 작업을 수행할 수 있는 유일한 배포판입니다. Ubuntu 14.04는 $PATH
예상대로 작동합니다.
스크립트에 추가해 보았습니다.
$ sudo ip netns exec blue PATH=$PATH
PATH=etcetc
그러나 실제 명령이 아니기 때문에 오류가 발생합니다 .
올바른 접근 방식은 무엇입니까?
답변1
항상 수행할 수 있는 두 가지 작업은 다음과 같습니다. 의심할 여지가 없도록 명령의 정규화된 이름을 사용합니다. 내 스크립트에서는 환경을 외부적으로 수정할 때(즉, 환경과 독립적으로) 문제를 피하기 위해 스크립트 내에 구체적으로 PATH 변수를 설정했습니다. 어쨌든 이것은 좋은 일반적인 관행처럼 보입니다.