특정 디렉토리에서 작업하는 동안 로컬 별칭을 만들고 싶습니다. 예를 들어, 다음과 같은 파일을 다음과 같이 갖고 싶습니다.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)