매개변수에 파이프 이스케이프 해제

매개변수에 파이프 이스케이프 해제

두 개의 인수를 받아 명령으로 실행하고 출력을 파일에 덤프하는 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 프로그램에 텍스트 문자열로 전달하는 경우입니다. 코드는 프로그램의 일부로 실행되기 전에 어떤 방식으로든 컴파일(및 링크)되어야 합니다.

관련 정보