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

関連情報