네트워크 네임스페이스와 스크립트가 $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

왜. 그것은 그들이 내 바이너리를 많이 볼 수 없다는 것을 의미했기 때문에 내 스크립팅 생태계를 깨뜨렸습니다.

제가 테스트한 두 배포판 중 Fedora 24가 이 작업을 수행할 수 있는 유일한 배포판입니다. Ubuntu 14.04는 $PATH예상대로 작동합니다.

스크립트에 추가해 보았습니다.

$ sudo ip netns exec blue PATH=$PATH

PATH=etcetc그러나 실제 명령이 아니기 때문에 오류가 발생합니다 .

올바른 접근 방식은 무엇입니까?

답변1

항상 수행할 수 있는 두 가지 작업은 다음과 같습니다. 의심할 여지가 없도록 명령의 정규화된 이름을 사용합니다. 내 스크립트에서는 환경을 외부적으로 수정할 때(즉, 환경과 독립적으로) 문제를 피하기 위해 스크립트 내에 구체적으로 PATH 변수를 설정했습니다. 어쨌든 이것은 좋은 일반적인 관행처럼 보입니다.

관련 정보