エイリアスを取得できませんでした。そのファイルやディレクトリはありません。

エイリアスを取得できませんでした。そのファイルやディレクトリはありません。

深いディレクトリツリーにはさまざまなバージョンのシェルスクリプトがあります。これを単純化するために、エイリアスを生成する機能を追加しました(コマンドラインオプションで選択)。

function make_alias {
    local CMD NAME
    NAME=$( basename ${BASH_SOURCE[0]} )
    CMD=$( realpath ${BASH_SOURCE[0]} )
    echo "alias $NAME=\"$CMD\""
    exit 0
}

実行すると、stdoutに有効なエイリアスコマンドが生成されます。

$ ./myscript -a
alias myscript="/home/symcbean/library/tools/webserver/myscript"

カットして貼り付けると機能します。

ただし、現在のシェルから出力を取得しようとするとエラーが発生します。

$ source $(./myscript -a)
-bash: alias: No such file or directory

私は何を見逃していますか?

(Ubuntu 22.04でbash 5.1.16を使用)

答え1

source $(./myscript -a)

それは動作しません。source他のシェルスクリプトファイルのソースコードを読み込み、現在のシェルで実行することを意味します。そうすることeval $(./myscript -a)はできますが、まあ、エイリアスに対する本当に厄介なユースケースです。

正直なところ、私は/var/runの下のディレクトリにスクリプトへのシンボリックリンクを置き、それをパスに追加しました(まだパスの一部ではない場合)。

function make_alias {
  local executable
  local binpath

  executable=$0
  binpath="/var/run/${UID}/shortcuts"

  mkdir -p "${binpath}"
  # next 3 lines adapted from https://superuser.com/a/39995/563936
  if [[ ":$PATH:" != *":${binpath}:"* ]]; then
    PATH="${PATH:+"$PATH:"}${binpath}"
  fi

  # Place symlink in /var/run sudirectory
  ln -s "$(realpath "${executable}")" "${binpath}/$(basename "${executable}")"
}

個人的には、これは多くのエイリアスでシェルを複雑にするよりもはるかにエレガントだと思います。選択に配置して$PATH優先順位を定義できます。つまり、重要なシステムコマンドが誤って隠されておらず、typeまだwhich押されています。期待どおりに機能し、インポートが簡単です。 (対応するディレクトリを確認して)作成したショートカットの概要とショートカットは、各シェルで設定せずに複数のシェル間で転送されます(両方のシェルに存在する限り$binpath$PATH...

関連情報