한 줄에 저장된 명령이 포함된 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이 발견되지 않더라도 현재 디렉토리는 고려되지 않습니다.)$PATH
file
bash
file
$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
사용하십시오 .awk
perl
// 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
(나는 이것이 오래된 질문이라는 것을 알고 있습니다.)