긴 이야기 짧게

긴 이야기 짧게

eval명령문의 일부로 파일에 명령문을 추가할 때 명령문이 평가되지 않도록 하려면 어떻게 해야 합니까 cat << __EOF__?

긴 이야기 짧게

저는 다수의 Linux 서버에서 서비스를 관리합니다. 종종 할당된 일부 기본 터미널 색상으로 인해 머리가 아프기 때문에 LS_COLORS이를 터미널에 붙여넣고 색상 문제를 해결하는 빠른 스크립트를 작성했습니다. 이 스크립트는 다음과 같습니다.

cat >> ~/.dircolors << __EOF__
OTHER_WRITABLE 01;30;41 # dir that is other-writable (o+w) and not sticky
__EOF__
cat >> ~/.bashrc << __EOF__

# Customize directory listing colors.
eval `dircolors ~/.dircolors`
export LS_COLORS
__EOF__
eval `dircolors ~/.dircolors`

이는 내가 지정한 세션에서는 제대로 작동하지만 다시 로그인하면 다음 오류가 발생합니다.

-bash: 30: command not found
-bash: 41:: command not found
[me@myserver ~]$

.bashrc여러분 중 일부는 내가 내 것을 봤을 때 마지막 4줄이 다음과 같다는 것을 깨달았을 것입니다 .

# Customize directory listing colors.
eval LS_COLORS='ow=01;30;41:';
export LS_COLORS
export LS_COLORS

그러나 다시 변경하면 다음과 같습니다.

eval `dircolors ~/.dircolors`

다음에 로그인하면 모든 것이 잘 작동합니다.

답변1

여기서 평가되는 내용은 입니다 eval. eval스크립트의 단어는 완전히 비활성입니다. 결국 출력에 나타나는 것을 볼 수 있습니다.

평가되는 것은 명령 대체(백틱 부분)입니다. 파일에 기록된 텍스트에 리터럴 백틱을 포함하려면 백슬래시로 보호하십시오.

cat >> ~/.bashrc << __EOF__

# Customize directory listing colors.
eval \`dircolors ~/.dircolors\`
export LS_COLORS
__EOF__

또는 이 문서를 변수 및 명령 대체를 수행하는 대신 텍스트를 있는 그대로 사용하는 텍스트 문서로 만듭니다. 연산자 뒤의 닫는 태그 부분을 인용하면 됩니다 <<.

cat >> ~/.bashrc <<\__EOF__

# Customize directory listing colors.
eval `dircolors ~/.dircolors`
export LS_COLORS
__EOF__

답변2

쉘 코드의 분할 문 이므로 실행 , 명령 , 명령 순서 ;로 진행됩니다 . 이는 일부 테스트 호출에서 관찰할 수 있습니다.evalLS_COLORS=ow=013041:echo

% echo 'test;echo hi;echo there'
test;echo hi;echo there
% eval echo 'test;echo hi;echo there'
test
hi
there
% 

한 가지 해결책에는 더 많은 인용이 포함됩니다.

% eval "echo 'test;echo hi;echo there'"
test;echo hi;echo there
% 

이렇게 하면 분리된 명령 목록 eval대신 단일 명령(일부 매개변수 포함)만 표시됩니다 .echo;

관련 정보