eval과 alias 명령의 차이점

eval과 alias 명령의 차이점

eval이들명령 그리고 명령 alias의 차이점은 무엇인가요 ?

예:

x=‘ls -d -l $HOME’
$x
eval $x

alias y=‘ls -l -d $HOME’
y

답변1

주로 의미론. 명령 문자열을 변수로 결합하는 것은 스크립팅에는 유용하지만 앨리어싱에는 적합하지 않습니다. 분명한 이유 중 하나는 완성입니다. bash_completion별칭을 처리할 수 있는 것과 같은 다양한 완성 스크립트가 있지만 (슬프게도 나에게는 이런 일이 발생하지 않았습니다), 변수가 명령으로 확장 가능하다고 가정하게 하면 다소 혼란스러울 수 있습니다.

두 번째 이유는 마법 명령이나 문자(예: 실행) alias를 사용하지 않고도 명령 단축키를 만들 수 있다는 것 입니다. $이렇게 하면 교체가 투명하게 이루어지며 일부 프로그램의 기본 설정을 재정의할 수 있습니다. 좋은 예는 ls종종 별명으로 기본값이 지정된다는 것입니다 ls --color=auto. 사용자는 컬러 출력을 보기 위해 이를 알 필요가 없습니다. 일부 배포판에는 rm별칭과 관련 명령이 있어 rm -i대화형 모드에서 작동하고 실수로 삭제되는 것을 방지합니다.

반면 변수는 바이너리를 에뮬레이션할 필요가 없는 특정 목적에 유용할 수 있습니다. 광범위하고 좋은 예는 EDITOR환경 변수입니다. 즐겨 사용하는 편집기를 실행하는 데 사용할 수 있을 뿐만 아니라 $EDITOR(셸에 액세스할 수 없는) 다른 프로그램을 활성화하여 이를 실행하고 실행 환경에서 해당 값을 얻을 수도 있습니다.

내가 인식하지 못하는 다른 일이 진행되고 있을 수도 있지만 결과는 동일합니다. 명령은 의도한 대로 작동합니다.

답변2

별칭은 스크립트에서 사용할 수 없습니다(비대화형 쉘에서는 기본적으로 비활성화되어 있습니다. 여러 개의 별칭을 결합할 수도 있습니다(예: 평가를 위한 여러 문자열). 그러나 별칭은 명령에서 얻는 좋은 수준의 간접 참조를 제공하지 않습니다. 행이 구문 분석됩니다. 두 배:

text1=foo; text2=bar; text3=fubar
for((i=1;i<4;i++)); do
  eval echo \$text${i}
done

나는 이것이 eval() 없이 수행될 수 있다는 것을 인정합니다 varname=text${i}; echo ${!varname}. 하지만 저는 명령을 작성할 때 항상 eval을 사용합니다.

shell-expand-line (MCe) 둘 다 오류 없이 작동합니다. :-)

관련 정보