Bash 함수에서 "z" 명령을 사용할 수 없는 이유는 무엇입니까?

Bash 함수에서 "z" 명령을 사용할 수 없는 이유는 무엇입니까?

내가 성취하고 싶은 것은: 디렉토리로 이동하여 그 내용을 나열하는 것입니다.

.bash_aliases에 추가한 bash 함수는 다음과 같습니다.

function zl(){
  
  z $1 && ls
}

그러나 이 함수를 호출하면 다음과 같은 오류가 발생합니다.

❯ zl node
z: command not found

하지만 z 명령만 사용하면 완벽하게 작동합니다.

함수 내에서 z 명령을 사용할 수 없는 이유는 무엇입니까?

내가 시도한 수정 사항:

  1. 함수에 소스 /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

관련 정보