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