저는 Xilinx ISE를 사용하고 있으며 프로그램은 모든 도구에 대한 경로를 설정하기 위해 공급업체 스크립트를 가져와야 합니다. 이 스크립트는 셸의 일부 기능을 손상시키기 때문에 셸이 시작될 때 가져오고 싶지 않고 필요할 때만 가져오고 싶습니다.
source /long/path/to/script
편의상 프로그램에서 제공하는 도구가 설치 스크립트 없이도 항상 작동하기를 원합니다 . 아이디어는 아래와 같이 n개 프로그램 각각에 대한 별칭을 갖는 것입니다(예를 들어 이름이 p1,...,pn이라고 가정해 보겠습니다).
alias p1='source /long/path/;unalias p1;...;unalias pn;p1'
프로그램이 많기 때문에 unalias 체인 업데이트를 단순화하고 싶습니다. 아이디어는 소유하는 것입니다 alias iseRemoveSetup='unalias p1;...;pn'
. 프로그램 별칭을 더 쉽게 구성하기 위해 iseRemoveSetup
몇 가지 기능을 정의했습니다. 그러나 iseAddToRemoveCall
별칭 명령(여기 analyzer
)에서 호출하면 아무런 효과가 없습니다. 쉘에서 직접 호출하면 제대로 작동합니다.
나에게 관련된 부분은 다음과 같습니다 .bashrc
.
alias iseRemoveSetup=''
function iseAddToRemove() {
alias iseRemoveSetup=`(alias iseRemoveSetup | cut -f2 -d "'")`"unalias $1;"
}
function iseAddToRemoveCall() {
iseAddToRemove $1
echo "iseRemoveSetup;$1"
}
alias setupise='source /home/ted/Xilinx/tools/14.7/ISE_DS/settings64.sh'
alias analyzer='setupise;'`iseAddToRemoveCall "analyzer"`
나는 다음과 같은 기능을 갖는 것이 아이디어라는 것을 알고 있습니다.
function iseAlias() {
alias $1='setupise;'`iseAddToRemoveCall $1`
}
하지만 먼저 위에서 설명한 문제를 해결하고 싶습니다. 을 실행하면 문제가 분명해지며 type iseRemoveSetup
다음과 같이 출력됩니다.
iseRemoveSetup is aliased to `'
답변1
문제는 별칭 정의(그 중 하나 iseRemoveSetup
)가 하위 쉘에 있다는 것입니다.
별칭 분석기='setupise;''iseAddToRemoveCall "분석기"`
시작된 서브셸 의 경우 iseAddToRemoveCall "analyzer"
별칭 정의는 해당 서브셸에만 영향을 미치며 이 줄이 완료된 후에 사라집니다.
이 문제는 변경하면 해결될 수 있습니다.
alias analyzer='setupise;'`iseAddToRemoveCall "analyzer"`
도착하다
alias analyzer='setupise;$(iseAddToRemoveCall analyzer)'
echo "iseRemoveSetup;$1"
(in iseAddToRemoveCall
)을 로 바꾸 십시오 echo "unalias $1;$1"
. 따라서 unalias
별칭 확장의 일부가 되고 올바른 쉘에서 실행됩니다.
선택하다
나에게는 이 모든 것이 이상해 보인다. 서브셸을 시작하고( Enter bash
), 설치 프로그램을 실행하고, 명령을 실행한 다음, ^D
완료되면 서브셸을 떠나는( ) 것이 더 합리적이지 않습니까?
추가 정보
man 1 bash
:
대체 텍스트의 첫 번째 단어는 별칭이 있는지 테스트되지만 확장되는 단어와 동일한 별칭을 가진 단어는 다시 확장되지 않습니다. 즉, ls는 ls -F로 별칭이 지정될 수 있으며 bash는 대체 텍스트를 재귀적으로 확장하려고 시도하지 않습니다.
따라서 별칭 을 호출하기 전에 unalias p1
별칭을 정의 할 필요가 없습니다 pi
.
별칭을 해제하려는 명령과 함께 (연관) 배열을 사용한 다음 해당 배열을 사용하는 것이 더 좋습니다.
해서는 안 되는 일을 하기 때문에 이는 또한 중요합니다.
Bash는 해당 줄에서 명령을 실행하기 전에 항상 입력의 전체 줄을 하나 이상 읽습니다. 별칭은 명령이 실행될 때가 아니라 명령을 읽을 때 확장됩니다. 따라서 다른 명령과 같은 줄에 나타나는 별칭 정의는 다음 입력 줄을 읽을 때까지 적용되지 않습니다. 줄에서 별칭 정의 뒤에 오는 명령은 새 별칭의 영향을 받지 않습니다. 이 동작은 함수를 실행할 때도 문제가 됩니다. 함수 정의 자체가 복합 명령이기 때문에 함수가 실행될 때가 아니라 함수 정의를 읽을 때 별칭이 확장됩니다. 따라서 함수에 정의된 별칭은 함수가 실행된 후에만 사용할 수 있습니다. 안전을 위해 항상 별칭 정의를 별도의 줄에 배치하고 복합 명령에 별칭을 사용하지 마십시오.