변수에서 명령을 실행하십시오.

변수에서 명령을 실행하십시오.

변수에 저장된 명령을 실행하려고 합니다.

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인쇄합니다 . 만약 내가한다면:\nechostdin

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"';

관련 정보