내가 성취하고 싶은 것은: 디렉토리로 이동하여 그 내용을 나열하는 것입니다.
.bash_aliases에 추가한 bash 함수는 다음과 같습니다.
function zl(){
z $1 && ls
}
그러나 이 함수를 호출하면 다음과 같은 오류가 발생합니다.
❯ zl node
z: command not found
하지만 z 명령만 사용하면 완벽하게 작동합니다.
함수 내에서 z 명령을 사용할 수 없는 이유는 무엇입니까?
내가 시도한 수정 사항:
- 함수에 소스 /home/me/z.sh를 추가하세요.
function zl(){
source /home/nair/z.sh
z $1 && ls
}
편집하다:z는 점프 명령입니다
답변1
~에 따르면그 근원은z
, 별칭입니다. 별칭은 C 전처리기 매크로와 약간 유사하며 명령이나 함수가 아닙니다. 기능이 없는 C 쉘에서 왔으며 실제로 Bourne과 같은 쉘에 속하지 않습니다. 그러나 csh가 오랫동안 매우 인기 있는 쉘이었기 때문에 사람들은 계속해서 이를 사용합니다.
별칭은 실행 시가 아닌 읽기 시 확장됩니다(별칭을 실행하는 것이 적합한 경우). 따라서 함수에서 함수 본문을 읽을 때 함수 본문으로 확장되므로 여기서는 쉘이 함수 정의를 읽을 때 별칭을 정의해야 하므로 함수 정의가 . /path/to/z.sh
또는 줄 뒤에 오는지 확인해야 합니다. 두 명령문을 차례로 읽고 실행하는지 확인하십시오(예: 동일한 복합 명령의 일부가 아님).source /path/to/z.sh
~/.bashrc
또는 별칭은 다음과 같이 정의됩니다.
alias ${_Z_CMD:-z}='_z 2>&1'
(매개변수 확장 주위에 따옴표가 없다는 점에 유의하세요. 이는 실수이기도 합니다.) 함수를 다음과 같이 작성할 수 있습니다.
zl(){
_z "$@" && ls
}
( 2>&1
정말로 stderr을 stdout에 병합하려면 추가하세요)
"$@"
우리가 지나 가면서모두인용하지 않은 것처럼 인수는 첫 번째 인수뿐만 아니라 분할+glob 이후의 첫 번째 인수는 물론 zl
수신됩니다 ._z
$1