두 개의 인수를 받아 명령으로 실행하고 출력을 파일에 덤프하는 bash 스크립트를 작성하고 싶습니다. myscript.sh
콘텐츠:
$1 > file1.tmp
$2 > file2.tmp
이는 다음 예에서 잘 작동합니다.
myscript.sh 'echo Hello World' 'echo Hello World 2'
file1.tmp
이제 텍스트를 포함 Hello World
하고 file2.tmp
텍스트를 포함합니다.Hello World 2
그러나 파이프가 포함된 명령을 사용하면 실패합니다.
myscript.sh 'ls | grep stuff' 'ls | grep morestuff'
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access stuff: No such file or directory
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access morestuff: No such file or directory
다음 명령을 실행하면 첫 번째 오류와 유사한 출력이 표시되므로 파이프가 이스케이프되는 것 같습니다.
ls \|
ls: cannot access |: No such file or directory
스크립트에서 파이프를 이스케이프 해제하는 방법은 무엇입니까?
답변1
쉘 코드 조각을 스크립트에 전달하고 있습니다. 스크립트에서 이것은 단지 텍스트일 뿐입니다. 이를 완전한 쉘 명령으로 해석하려면 eval
다음을 수행해야 합니다.
eval "$1" >file1.tmp
eval "$2" >file2.tmp
$1
$2
이것은 단순한 일일 때 작동합니다 echo hello
.간단한 명령(목록이나 복합 명령이 아님)
다른 프로그래밍 언어와의 비유는 C 코드 조각을 C 프로그램에 텍스트 문자열로 전달하는 경우입니다. 코드는 프로그램의 일부로 실행되기 전에 어떤 방식으로든 컴파일(및 링크)되어야 합니다.