리디렉션/파이프라인 명령을 스크립트에 저장하고 실행합니다.

리디렉션/파이프라인 명령을 스크립트에 저장하고 실행합니다.

리디렉션과 파이프를 사용하여 명령을 저장하고 나중에 실행하는 방법은 무엇입니까? (내 문제의 원인이 파이프인가요, 리디렉션인가요, 아니면 둘 다인가요?)

스크립트에서 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.

관련 정보