루프에서 변수 확장을 사용하여 명령 생성

루프에서 변수 확장을 사용하여 명령 생성

특정 디렉토리에서 작업할 때 로컬 별칭을 만들고 싶습니다. 예를 들어, 다음과 같은 파일을 다음과 같이 갖고 싶습니다.local_alias

alias foo='bar'

작업이 완료된 후 이러한 별칭을 제거하는 정리 스크립트를 작성하고 싶습니다. 그것은 다음과 같습니다:

egrep "alias [[:alnum:]]+" local_alias -o|while read i; do
  un$i
done

중간 줄을 : 으로 변경하면 echo un$i출력은 올바른 형식의 unalias명령 처럼 보입니다 unalias foo. 그러나 쓰여진대로 나는 그것을 이해합니다 unalias: foo: not found.

중간 줄인 을 인용하려고 하면 "un$i"을 얻습니다 unalias foo: command not found.

내가 뭘 잘못했나요?

답변1

별칭은 셸마다 다르므로 다음과 같이 스크립트를 실행할 때:

#!/bin/bash

...
unalias ....
...

이는 서브셸로 실행되며 일반적으로 동일한 별칭을 갖지 않습니다. 문제를 더욱 복잡하게 하려면 처리해야 할 또 다른 문제가 있습니다. 스크립트가 종료되면 별칭이 제거된 하위 쉘은 사라지고 별칭이 그대로 유지된 상위 쉘로 돌아갑니다.

내가 아는 한, 현재 쉘의 별칭을 이런 방식으로 수정할 수 있는 방법은 없습니다.

그럼 어떻게 해야 할까요?

이 작업을 수행하기 위해 현재 셸 자체의 범위 내에서 별칭이나 함수를 생성할 수 있습니다.

별칭 솔루션

$ alias unalias_local='egrep "alias [[:alnum:]]+" local_alias -o|while read i; do un$i; done'

기능 솔루션

$ function unalias_local { egrep "alias [[:alnum:]]+" local_alias -o | \
    while read i; do un$i; done; }

위의 질문

OP는 이 답변에 대한 솔루션을 제공했으며 이는 자신의 시나리오에서 작동할 것이라고 말했습니다. 그러나 일반적으로 이와 같은 파이프 명령 체인의 별칭을 변경할 수 없습니다. 왜냐하면 각 파이프는 상위 셸에 접근할 수 없는 하위 셸을 호출하기 때문입니다. 그래서 우리는 이전 스크립트와 같은 문제로 돌아왔습니다.

이 문제를 해결하려면 별칭 목록을 명령에 대한 인수로 제공할 수 있습니다.

$ alias ali1="cmd1"
$ alias ali2="cmd2"

셸에서 별칭을 확인합니다.

$ alias | grep -E "ali[12]"
alias ali1='cmd1'
alias ali2='cmd2'

콘텐츠 local_alias:

$ cat local_alias 
alias ali1="cmd1"
alias ali2="cmd2"

이 명령은 파일에서 별칭 이름을 구문 분석합니다 local_alias.

$ grep -oP "(?<=alias )([[:alnum:]]+)" local_alias
ali1
ali2

unalias다음과 같이 이러한 별칭 과 함께 사용할 수 있습니다 .

$ unalias $(grep -oP "(?<=alias )([[:alnum:]]+)" local_alias)
$

이제 사라진 것을 확인하면 다음과 같습니다.

$ alias | grep -E "ali[12]"
$

답변2

이 코드를 별도의 스크립트에서 실행 중인 것으로 보입니다. 이것은 작동하지 않습니다. 실행 중인 셸의 구성을 변경해야 하며 다른 프로세스에서는 이 작업을 수행할 수 없습니다. 이 정리 코드는 .bashrc.

두 번째 문제는 파이프가 하위 프로세스(하위 쉘)도 생성한다는 것입니다. 따라서 이 코드를 대화형 셸에서 실행하면 unalias명령은 별칭을 제거하지만 하위 셸에서만 제거됩니다. unalias서브셸에서 명령을 실행하지 않는 다른 방법이 필요합니다 .

여러 가지 해결 방법이 있지만 가장 간단한 방법은 별칭 목록을 작성한 다음 명령을 unalias한 번 실행하는 것입니다. 별칭은 특수 문자를 포함할 수 없으므로 별칭 목록의 단어 분할은 벌금을 생성합니다 unalias.

unalias $(egrep -o "alias [[:alnum:]]+" local_alias)

관련 정보