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