별칭이 PATH 항목을 "재정의"하지 않습니까?


9

나의 마지막 줄 .bash_profile은 :

alias cp=/usr/local/bin/gcp

그러나 그것은 내 항목에 의해 뭉개지고 있습니다 $PATH:

$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'

별칭이 PATH..?


1
기술적으로, 별명은 envar의 값을 대체 하지 않습니다PATH .
can-ned_food

필수주의 : 일반적으로 일반적인 명령의 이름을 바꾸는 것은 좋지 않습니다. 이것은 두 가지 방법으로 물릴 수 있습니다. 1) 다른 시스템에서 작업하고 습관적으로 명령을 사용하면 기본 명령의 예기치 않은 동작이 발생합니다. 2) 다른 사람이 시스템을 사용하는 경우에도 문제 해결을위한 조언 / 도움이 되어도 예기치 않은 사용자 정의 동작이 발생합니다. 사용자 정의 명령은 괜찮습니다. 일반적인 명령과 동일하게 이름을 지정하지 마십시오.
Joe

@joe 사실 이것은 반대 의 경우가 더 많다 : cp 의 os / x 버전에는 nix의 옵션 이 없기 때문에 예상대로 동작하지 않는다 (
고양이

답변:


21

which명령은 실행 파일 만 반환합니다.이 프로그램은 외부 프로그램이므로 별칭에 대해 아무 것도 모르고 자식 프로세스에 별칭 정보를 전달하는 메커니즘이 없습니다.

명령을 입력하면 type -a cp기본 설정 순서대로 가능한 모든 해석이 표시됩니다. 때문에 이것은 별칭을 포함 typeA는 bash내부 명령.

별명은 시스템 명령을 실행할 수있는 옵션이있는 스크립트 또는 대화식 편집기와 같은 서브 프로세스에 의해 해석되지 않습니다.

당신이 만드는 경우 cp기능을, 다음 버전은 스크립트에서 실행됩니다 아니지만 다른 프로그램 :

cp() { /usr/local/bin/gcp "$@"; }

cp어디에서나 일하고 싶다면 목록 $HOME/bin의 머리 부분을 추가 PATH하고 가리 키 $HOME/bin/cp십시오.

ln -s /usr/local/bin/gcp $HOME/bin/cp

이렇게하면 심볼릭 링크가 만들어 지지만 좀 더 효율적인 하드 링크 (생략 -s)로 만들 수 있지만 일반적으로 루트 권한 ( sudo ln ...)이 필요합니다 . 함수를 만들고 PATH변수에 추가하는 것은 bash시작 스크립트 중 하나에서 사용자 권한으로 수행됩니다.


1
CentOS는 (그리고 AIUI 모든 레드햇) 표준 프로파일 (오버라이드 (override)하지 않는 한) 상에 만들어 지지만 별칭을 위해 which그 실행 /usr/bin/which의 입력과 출력에서 파이프 alias와는 일치하는 경우 별칭을 보여주기 위해 그 입력을 읽고 그것을 사용하도록 지시하는 옵션 명령. 참조 unix.stackexchange.com/questions/10525/...
dave_thompson_085

@ dave_thompson_085-흥미로운 의견 : 저는 그 배포판을 사용하지 않았습니다. 우분투를 사용하고에 대한 별칭 which을 지정 하여 동일한 효과를 얻을 수 있습니다 type. 그런 다음 which -a별명 및 함수 정의를 추가하여 외부 프로그램처럼 작동합니다. 일반적으로 별칭이나 함수 정의를 무시하고 외부 프로그램을 강제로 사용하려고 할 때 alias which=type사용 $(which ProgName)하고 싶기 때문에 .
AFH

1
하드 링크는 파일 시스템을 교차 할 수 없으므로 ln홈 디렉토리가와 동일한 파일 시스템에있는 경우 비 심볼 제안이 작동합니다 /usr/local/bin. gcp하드 링크가 여전히 이전 버전을 참조하기 때문에 업데이트하면 이상하게 작동합니다 .
쓸모없는

@ 쓸모없는-유효한 점은 권한 링크가 가장 중요한 고려 사항이라고 생각하지만 먼저 심볼릭 링크를 제안하기 위해 답변을 편집 한 이유 중 일부입니다. 업데이트에 관해서는 gcp, 그것은 업데이트가 개방 쓰기 또는 삭제하고 다시 작성하여 수행 여부 따라 달라집니다. 절대 링크 또는 상대 소스 경로를 사용하여 하드 링크를 작성하는지는 중요하지 않지만 심볼릭 링크에는 일반적으로 절대 경로가 필요합니다. 링크는 OS에서 광범위하게 사용되며 대부분 상징적입니다.
AFH

1
@ can-ned_food-현재 쉘에서 설정하는 것만 큼 간단하지 않습니다. 별명 가져 오기와 함께 각 스크립트에서 설정해야합니다.
AFH

13

별명은 쉘 내부에 있습니다. 다른 프로그램은 그들에 대해 알지 못합니다.

whichBash 내장이 아닙니다 (예 : zsh와 같은 다른 쉘에 내장되어 있음). 이후 which강타의 별칭으로 더 특권 정보가없는, which단지를 통해 보이는 PATH주어진 기간 동안.

type반면에 있다 가 별명에보고 할 수 있도록, 배쉬 내장.


2
또한 별칭은 명령의 첫 단어 인 경우에만 확장됩니다. 아마도 관련이 없을 수도 있습니다.
can-ned_food 2013 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.