변수에 저장된 명령을 실행하려고 합니다.
cmd="grep -i \"word1\" filename | grep -i \"word2\""
eval $cmd
하지만 스크립트를 실행하면 오류가 발생합니다.
grep: |: No such file or directory
grep: grep: No such file or directory
이 오류가 발생하지 않고 예제에서와 같은 명령을 어떻게 실행할 수 있습니까?
답변1
인용해야 하며 큰따옴표를 "$cmd"
사용하지 않는 것이 좋습니다 "
. 어쨌든 이를 실행하려면 꼭 필요합니다 eval
. 이는 .shell 변수가 단일 단순 명령의 한계를 넘어 확장되지 않기 때문이며 |pipe
복합 명령을 실행하려고 합니다.
그래서:
cmd='grep -i "word1" filename | grep -i "word2"'
eval "$cmd"
따옴표 없이 확장할 때 파일 이름 생성 및/또는 문제가 $cmd
발생할 수 있습니다. $IFS
안정적으로 참조되었는지 확인하세요. 또한 콘텐츠에 "word[12]"
큰따옴표나 백슬래시 등이 포함되어 있지 않은지 확인하세요. 그렇지 않으면 인용 스타일을 다시 평가해야 합니다.
이제 오류를 자세히 살펴보면 오류가 무엇인지 정확히 알 수 있습니다.
grep: |: No such file or directory
grep: grep: No such file or directory
그렇다면 다음과 같이 하세요.
echo | echo
첫 번째는 두 번째 에 ewline을 echo
인쇄합니다 . 만약 내가한다면:\n
echo
stdin
set \| echo
echo "$@"
첫 번째는 파이프와 . echo
인 각 인수를 인쇄합니다 .|
echo
차이점은 |
첫 번째 경우의 파이프가 쉘의 파서에 의해 토큰으로 해석되고, 토큰으로 해석된다는 것입니다. 두 번째 경우, |
쉘이 파이프 토큰을 검색하는 동안 $
확장 토큰도 검색합니다. 따라서 파이프가 해당 값으로 대체되지 않았기 |
때문에 검색되지 않았습니다 ."$@"
그렇다면 다음과 같이 하세요.
grep -i "word" filename \| grep -i "word2"
|
... 명령이 분리되어 있지 않지만 grep
해당 인수가 있기 때문에 동일한 결과를 얻을 수 있습니다.내부 파일위치.
$cmd
기본값을 사용하여 분할할 때 얻는 필드 수는 다음과 같습니다 $IFS
.
printf '<%s> ' $cmd
<grep> <-i> <"word1"> <filename> <|> <grep> <-i> <"word2">
파일 이름 생성은 다음을 수행할 수 있습니다:
touch 'echo 1simple &&' 'echo 2simple'
eval echo*
답변2
내가 사용하는 방법이 잘못되었습니다.바꾸다모든 명령을 저장하고 실행하십시오. 더 나은 선택이 있습니다 ——기능:
my_cmd() {grep -i "word1" filename | grep -i "word2"}
그게 다야.
또는 다음과 같은 다른 매개변수를 사용할 수 있습니다.
my_cmd() {grep -i "$1" "$3" | grep -i "$2"}
그런 다음 전화로 전화하세요.
my_cmd word1 word2 filename
답변3
게시한 예에서는 평가가 필요하지 않습니다. 다음과 같이 변수를 실행하면 됩니다.
cmd="grep -i \"word1\" filename | grep -i \"word2\""; # added missing " at the end
$cmd
귀하의 제안에 주의를 기울이십시오. 어쩌면 다음과 같은 것이 오류가 덜 발생할 수도 있습니다.
cmd='grep -i "word1" filename | grep -i "word2"';