Bash에서 명령 출력을 실제 명령줄로 실행할 수 있습니까?

Bash에서 명령 출력을 실제 명령줄로 실행할 수 있습니까?

예를 들어 설명하겠습니다.

내 별칭을 선언하는 줄이 있습니다 ~/.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

관련 정보