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

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

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

alias foo='bar'

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

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

중간 줄을 로 변경하면 출력은 올바른 형식의 명령 echo un$i과 같습니다 . 그러나 쓰여진대로 나는 .unaliasunalias foounalias: 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)

관련 정보