이것을 실행하면:
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
기본값이 변경되지 않으면 , , echo
4 'a';
단어 echo
가 됩니다 'b'
. 이러한 각 단어는 와일드카드 문자의 영향을 받습니다. 여기에는 와일드카드 문자가 포함되어 있지 않으므로 단어는 그대로 유지됩니다.
따라서 간단한 명령을 실행하기 위한 4개의 매개변수가 있습니다. 첫 번째 인수는 실행할 명령을 파생시키는 데 사용됩니다. echo
대부분의 쉘에는 이것이 내장되어 있습니다. 따라서 쉘은 echo
이 4개의 매개변수를 사용하여 내장 함수를 호출합니다.
echo
첫 번째(0번째) 인수를 무시하고 공백 문자로 구분되고 개행 문자로 끝나는 다른 인수를 출력합니다. 일부 echo
구현은 백슬래시 이스케이프 시퀀스를 확장하지만 여기서는 그렇지 않습니다. 따라서 echo
출력은 다음과 같습니다.
'a'; echo 'b'\n
이를 평가하려면, 즉 문자열을 쉘 코드로 해석하려면 다음을 사용하십시오 eval
.
eval "echo 'a'; echo 'b'"
이것은 또한 간단한 명령으로 간주됩니다. 따옴표로 인해 쉘에는 두 개의 "단어"가 표시됩니다: eval
및 echo '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