eval은 파이프 명령과 함께 사용됩니다.

eval은 파이프 명령과 함께 사용됩니다.

한 줄에 저장된 명령이 포함된 file.txt가 있고(명령은 콘솔에서 실행될 때 작동함) sh를 사용하여 한 줄에서 실행하고 싶습니다.

cat file.txt | eval

없어진 물건 있어요? 어떤 제안이 있으십니까?

내 파일에 많은 명령(한 줄에 하나씩)이 포함되어 있고 하나의 명령(전체 줄)만 실행하고 싶다면 어떻게 해야 합니까? 나의 첫 번째 생각은 다음과 같습니다.

head -n5 | tail -n1 | eval

답변1

eval표준 입력에서 해당 명령 문자열을 읽지 않습니다.

eval "$(cat file.txt)"
# or easier, in ksh/bash/zsh
eval "$(<file.txt)"
# usually you cannot be sure that a command ends at the end of line 5
eval "$(head -n 5 file.txt)"

대신, 명령이 파일에 있으면 eval표준 .또는 bash//를 사용할 수 있습니다 zsh.ksh source

source ./file

(추가가 중요합니다 . 그렇지 않으면 ./현재 디렉토리에 있는 것을 고려하기 전에 in source을 찾습니다 file. POSIX 모드에서는 in이 발견되지 않더라도 현재 디렉토리는 고려되지 않습니다.)$PATHfilebashfile$PATH

물론 파일의 일부를 선택하는 경우에는 작동하지 않습니다. 이는 다음을 통해 수행할 수 있습니다.

head -n 5 file.txt >commands.tmp
source ./commands.tmp

또는 (ksh93, zsh, bash 사용):

source <(head -n 5 file.txt)

답변2

따라서 문제에 대한 해결책은 100% 가능하며 (의 맥락에서 make) 중요합니다.

나는 makefile에서 이 문제에 부딪쳤고, 이미 Variables를 호출하는 데 사용된 makefile에 bash 명령을 중첩하는 것이 어렵다는 점을 고려하면 $(...), 원하는 것을 정확하게 수행할 수 있다면 좋을 것입니다.

그렇지 않은 경우 or 시스템 명령을 eval사용하십시오 .awkperl

// command_list.sh:
echo "1"
echo "2"
echo "3"

// command line prompt:
$: cat command_list.sh | awk '{system($0)}'
1
2 
3

그리고 명령 건물은 다음과 같습니다.

// a readable version--rather than building up an awk miniprogram, 
// split into logical blocks:

$: cat inputs.txt | awk '{print "building "$1" command "$2" here "}' | awk '{system($0)}' 

답변3

기술적으로 파이프에서 무언가를 읽으려는 경우 파이프의 각 명령이 별도의 프로세스로 실행되기 때문에 현재 환경에서 무언가를 평가하는 것은 불가능합니다.

그러나 달성하려는 목표에 따라 이는 중요하지 않을 수도 있습니다. 어쨌든, eval파이프라인의 내용에 대해 실행된 내용은 다음과 같습니다 .

❯ echo echo hi | eval "$(cat -)"
hi

캡쳐한 예시입니다. 다음과 같은 내용은 인쇄되지 않습니다 1.

❯ echo a=1 | eval "$(cat -)"; echo $a

우리는 다음을 수행해야 합니다:

❯ echo a=1 | { eval "$(cat -)"; echo $a; }
1

답변4

무엇을 사용해야 할지 잘 모르겠으면 eval다음을 사용하세요 sh.

cat file.txt | sh

예, 별도의 sh 인스턴스에서 실행되지만 해당 사실은 자체 문서화됩니다.

게다가 while read:

cat file.txt | while read cmd; do eval $cmd; done

file.txt의 5번째 줄에서 명령을 실행합니다.

sed -n 5p file.txt | sh

(나는 이것이 오래된 질문이라는 것을 알고 있습니다.)

관련 정보