[unix] Bash에서 su를 사용하여 여러 명령 실행

su -c루트 여러 명령을 모두 실행하는 데 사용 하고 싶습니다 . 이를 위해 추가 스크립트를 사용하고 싶지 않습니다.

나는 다음을 시도했다.

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & " -c "ls -lh"

그러나 ls첫 번째 는 실행 하지 않습니다.

나는 다음을 시도했다.

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

그러나 세미콜론에 오류가 있다고 말합니다 ;.

그렇게하는 방법을 알고 있습니까?



답변

이 명령은 정상적으로 실행됩니다.

su root -c "date; ls -lh"

그러나이 명령에서 :

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

당신이 가지고 있기 때문에 &전에 ;그러므로 당신은 오류를 받고 있습니다. &명령을 제거했다 가 다시 실행하십시오.

또는 다음과 같이 명령을 실행할 수 있습니다.

su root -c "(tcpdump -i wlan0 -s 1500 -w CCCCCC &); ls -lh"


답변

으로 anubhava는 말한다 , 당신을

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

바로 뒤에을 (를) 입력 할 수 없으므로 명령이 실패
&했습니다 ;. 셸에 직접 명령을 입력하여이를 확인할 수 있습니다.

  • true & true  공장
  • true & ; true 작동하지 않습니다

당신이 원하는 경우 tcpdump백그라운드에서 실행하는 명령을의 제거 ;와 같이,

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ls -lh;"

(그리고 ;끝에도 필요 하지 않지만 아프지 않습니다).


답변

나는 nohup명령이 당신에게 원하는 것을 얻을 것이라고 생각합니다 … tcpdump가 백그라운드에서 실행됩니다 (앰퍼샌드가 필요 없음)

su root -c "nohup tcpdump -i wlan0 -s 1500 -w CCCCCC ; ls -lh"


답변

Anubhava의 탁월한 답변 에 추가하기 만하면됩니다 .

다음 {}과 같이 사용할 수도 있습니다 .

su root -c "{ tcpdump -i wlan0 -s 1500 -w CCCCCC & }; ls -lh"

{}()하위 셸을 만들지 않는 것보다 조금 더 효율적 입니다. 우리가 이미 가지고 있지 않는 한 전후 {}공간이 필요합니다 .{;}&


답변

다음 &&과 같이 명령을 구분하는 데 사용하십시오 .

$ su -c "ls && ls"


답변