리디렉션과 파이프를 사용하여 명령을 저장하고 나중에 실행하는 방법은 무엇입니까? (내 문제의 원인이 파이프인가요, 리디렉션인가요, 아니면 둘 다인가요?)
스크립트에서 urxvt 버전을 인쇄하고 실제 명령을 에코해 보았습니다.
버전을 가져오는 데 사용하는 명령은 다음과 같습니다 urxvt -help 2>&1 | head -n 2
. 어떤 이유로 urxvt는 도움말을 인쇄합니다 stderr
. 그 이유는 head
처음 두 줄에만 버전 및 구성 데이터가 포함되어 있기 때문입니다.
셸에서는 잘 작동하지만 스크립트(아래에 격리된 문제)에서 세 번째 줄은 의미를 잃은 것 같습니다.
#!/bin/bash
VER_URXVT='urxvt -help 2>&1 | head -n 2'
echo $VER_URXVT
$VER_URXVT
답변1
사용:
VER_URXVT=`urxvt -help 2>&1 | head -n 2`
동일:
VER_URXVT=$(urxvt -help 2>&1 | head -n 2)
urxvt
에 도움말 의 처음 두 줄을 입력하세요 VER_URXVT
.
쉘 변수의 명령을 평가하려면 다음을 사용해야 합니다 eval
.
VER_URXVT='urxvt -help 2>&1 | head -n 2'
eval $VER_URXVT
답변2
나는 항상 eval
변수를 사용하는 것보다 함수가 더 낫다고 생각했습니다.
#!/bin/bash
version() { uname -a;}
wm() { head -n1 <(openbox --version);}
for f in $(compgen -A function)
do declare -f $f | sed '1,2d; $d'
$f
done
답변3
eval
편집 중인 내용을 실제로 알지 않는 한 절대 사용하지 마십시오 eval
.
대신 함수를 사용하세요.
#!/bin/bash
ver_urxvt() { urxvt -help 2>&1 | head -n 2;}
declare -f ver_urxvt | sed '1,2d; $d'
ver_urxvt
하지만 이 정보를 인쇄하는 것은 시간 낭비이기 때문에 이는 어리석은 일입니다.
스크립트를 디버그하려면 내장 -x
옵션 을 사용하세요.set
답변4
평가 표현식을 사용해야 합니다.
#!/bin/bash
VER_URXVT='urxvt -help 2>&1 | head -n 2'
echo $VER_URXVT
eval $VER_URXVT
매뉴얼 페이지의 평가
The args are read and concatenated together into a single com-
mand. This command is then read and executed by the shell, and
its exit status is returned as the value of eval. If there are
no args, or only null arguments, eval returns 0.