두 명령을 평가하는 방법은 무엇입니까?

두 명령을 평가하는 방법은 무엇입니까?

이것을 실행하면:

echo "echo 'a'; echo 'b'"

그러면 실행할 수 있는 문자열이 생성되고 작동합니다 a\nb\n. 에코가 발생합니다.

그러나 이것은 작동하지 않습니다.

$(echo "echo 'a'; echo 'b'")

왜 안 돼? 에코뿐만 아니라 어떤 명령에서도 작동하지 않습니다. 두 개 이상의 명령이 포함된 문자열을 실행하는 방법은 무엇입니까?

답변1

셸 에서 $(echo "echo 'a'; echo 'b'")명령 대체를 참조하세요. 그게 다야. 따라서 이는 확장 명령 대체 시 인수가 Split+Glob 연산자의 결과인 간단한 명령이 됩니다.

쉘은 명령의 출력을 취합니다 echo "echo 'a'; echo 'b'". 이 경우 echo 'a'; echo 'b'\n후행 개행 문자를 제거하여 가 되도록 echo 'a'; echo 'b'하고 변수 값에 따라 분할합니다 $IFS.

$IFS기본값이 변경되지 않으면 , , echo4 'a';단어 echo가 됩니다 'b'. 이러한 각 단어는 와일드카드 문자의 영향을 받습니다. 여기에는 와일드카드 문자가 포함되어 있지 않으므로 단어는 그대로 유지됩니다.

따라서 간단한 명령을 실행하기 위한 4개의 매개변수가 있습니다. 첫 번째 인수는 실행할 명령을 파생시키는 데 사용됩니다. echo대부분의 쉘에는 이것이 내장되어 있습니다. 따라서 쉘은 echo이 4개의 매개변수를 사용하여 내장 함수를 호출합니다.

echo첫 번째(0번째) 인수를 무시하고 공백 문자로 구분되고 개행 문자로 끝나는 다른 인수를 출력합니다. 일부 echo구현은 백슬래시 이스케이프 시퀀스를 확장하지만 여기서는 그렇지 않습니다. 따라서 echo출력은 다음과 같습니다.

'a'; echo 'b'\n

이를 평가하려면, 즉 문자열을 쉘 코드로 해석하려면 다음을 사용하십시오 eval.

eval "echo 'a'; echo 'b'"

이것은 또한 간단한 명령으로 간주됩니다. 따옴표로 인해 쉘에는 두 개의 "단어"가 표시됩니다: evalecho 'a'; echo 'b'. 마찬가지로, 이는 첫 번째 명령에서 파생된 명령에 대한 인수를 형성합니다.

여기에 있는 명령은 eval셸에 내장된 명령입니다. 다시 eval첫 번째 인수를 무시합니다. 이것이 하는 일은 다른 인수(여기서는 하나만 있음)를 공백으로 연결하고 결과 문자열을 쉘 코드로 해석하는 것입니다. 통역할 때

echo 'a'; echo 'b'

쉘은 ;명령을 구분하기 위해 인용되지 않은 명령을 봅니다. 첫 번째는 간단한 명령으로 처리되며 궁극적으로 echo두 개의 인수로 호출됩니다... 등등.

답변2

if eval "( service networking restart &> /dev/null   &&   ping -c3 google.com &> /dev/null )"; then      
   echo "service is running"                              
else  
   echo "service is not running"    
fi

관련 정보