예를 들어 설명하겠습니다.
내 별칭을 선언하는 줄이 있습니다 ~/.bashrc
.
> grep lsdir ~/.bashrc
alias lsdir='ls -d */'
방금 bashrc에 이 줄을 추가했기 때문에 별칭이 아직 현재 세션 환경에 추가되지 않았습니다. 일부 구성상의 이유로 모든 bashrc를 리소스로 사용하고 싶지 않기 때문에 이 grep 라인을 개별적으로 실행하고 싶습니다.
호기심과 교육적 목적으로 손으로 적어보려고 했지만 성공하지 못했습니다.
나는 이것을 시도했습니다 :
> $(grep lsdir ~/.bashrc)
bash: alias: -d: not found
bash: alias: */': not found
아니면 이거:
> "$(grep lsdir ~/.bashrc)"
bash: alias lsdir='ls -d */': No such file or directory
아니면 이것도:
> $("grep lsdir ~/.bashrc")
bash: grep lsdir ~/.bashrc: No such file or directory
그러나 그들 중 누구도 일하지 않았습니다. 이것을 달성할 수 있는 방법이 있나요?
답변1
당신이 사용할 수있는프로세스 교체일치하는 행만 가져옵니다.
source <(grep lsdir ~/.bashrc)
답변2
나는 답을 찾았습니다:
핵심은 내장된 eval
.
> eval "$(grep lsdir ~/.bashrc)"
> type lsdir
lsdir is aliased to `ls -d */'
답변3
기존 답변은 작동하는 솔루션을 제공하지만 원래 명령이 $(grep lsdir ~/.bashrc)
작동하지 않는 이유를 설명하는 답변은 없습니다.
실제로 쉘은 대체 중에 명령에 대해 제한적인 작업을 수행합니다. 단어 분할은 수행되지만 따옴표 처리는 수행되지 않습니다.
pi@raspberrypi:~ $ echo 'a'
a
pi@raspberrypi:~ $ echo "echo 'a'"
echo 'a'
pi@raspberrypi:~ $ $(echo "echo 'a'")
'a'
마지막 줄에서 볼 수 있듯이 echo 'a'
명령( )과 인수( )에서 분할이 정확하지만 인수 자체는 인용되지 않으므로 인용이 그대로 유지됩니다. 그건 그렇고, 시도하면 거의 같은 일이 발생합니다echo
'a'
쉘 명령을 변수에 저장.
귀하의 경우 alias lsdir='ls -d */'
명령, alias
해당 인수 및 예상치 못한 두 개의 lsdir='ls
추가 인수( -d
및 */'
)로 분할됩니다.alias
모든 명령 처리(인용문 처리 포함)를 다시 실행할 수 있는 자연스러운 솔루션은 을 사용하는 것이며 eval
답변 중 하나가 이미 언급했습니다.
답변4
변수를 출력으로 사용할 수 있습니다
torun=$(some commands | adapting/parsing results #be aware of multiline returns too)
${torun} # call the generated command
${torun}
토론으로 인해 여기에 언급된 것처럼 대부분의 경우 변수를 명령으로 적용할 때 이스케이프 문자나 인용 문제를 피하기 위해 명령 결과를 구문 분석/분석하기 위해 파이프를 사용하여 하위 명령을 추가해야 한다는 것이 좋습니다.
즉, 문자열을 변수 정의 줄 내에서 사용할 수 있는 명령으로 만드는 것을 잊지 마십시오.
전형적인:
torun=$( command | sed '....;.....;....' ) #or awk or any string management tools