일반적으로 bash는 세미콜론으로 구분 될 때 순서대로 명령을 실행할 것으로 예상합니다.
예를 들어, cmd1은 다음에서 cmd2보다 먼저 실행됩니다. cmd1;cmd2
그러나 나는 이것이 사실이 아닌 시나리오를 보았습니다.
echo 'my password' | sudo -S su -c "echo a 1>&2 ; $(echo b 1>&2)" root
나는 출력이
a
b
하지만 실제로
b
a
왜?
su 명령에 대한 c 플래그와 관련이 있습니까? 두 번째 명령을 서브 쉘에 넣을 때만 발생하는 것 같습니다.
IO 리디렉션이 범인이 아니라는 점에 유의하십시오. 문제를 쉽게 설명하기 위해 추가했습니다. a cd
및 a와 같은 다른 명령을 넣으면 stat
실제로 순서가 잘못되어 실행되는 것을 볼 수 있습니다.
$ echo "hello $(echo world)"
hello world
$( ... )
내부에서 명령을 실행하고 수집 된 출력을 대체합니다. 즉, 위의 명령이 실행 echo "hello world"
됩니다.
비슷하게,
sudo -S su -c "echo a 1>&2 ; $(echo b)"
뛰게 될거야
sudo -S su -c "echo a 1>&2 ; b"
그러나 $(echo b 1>&2)
명령 b
을 사용하면 stderr (및 stdout에 아무것도 기록 하지 않음)에 기록하므로 셸이 b
화면에 나타나는 문자열을 처리하는 동안 전체 $( ... )
구성이 아무것도 변경되지 않습니다 (표준 출력에 아무것도 기록하지 않기 때문에).
결국 실행되는 것은
sudo -S su -c "echo a 1>&2 ; " root
당신이 원하는 것은 서브 쉘에서 명령을 실행하는 것 ( ... )
뿐 이라면 $( ... )
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다