Windows環境変数に対応するUnixがあるかどうか疑問に思いますPATHEXT
。
Windowsの背景知識がない場合:ファイルサフィックスを追加すると、PATHEXT
cmd.exeにサフィックスを入力せずにスクリプトを実行できます。たとえば、私のWindowsコンピュータでは、PATHEXTにはサフィックスが含まれており、.pl
cmd.exeでPerlスクリプトを実行するにはサフィックスを入力するだけですmy-script
。ただし、Bashで同じスクリプトを実行するには、フルネームを作成する必要がありますmy-script.pl
。
私は現在WindowsとUnixの両方で作業しているので、Unixシステムに戻るときにサフィックス入力を忘れてしまうトラップにほとんどいつも落ちます。
答え1
最も簡単な解決策は、スクリプト拡張を使用しないことです。これは必須ではなく、コンピュータ以外のユーザーにスクリプトの種類を識別するためにのみ使用されます。 Windowsは拡張子を使用してファイルタイプを識別しますが、* nixシステム(まれな場合を除くgzip
)は使用しません。
バイナリファイルは* nixに.exe
拡張子がなく、単に呼び出されるfoo
ことに注意してくださいfoo.exe
。したがって、foo.pl
実行可能ファイルが必要な場合は、foo
最初にファイルを保存してください。foo
または、何らかの理由で拡張機能が必要な場合は、スクリプトを保存したディレクトリに移動して次のコマンドを実行してください。
for f in *.*; do ln -s "$f" "${f%%.*}"; done
これは拡張子を持つすべてのファイルに対して繰り返され、その中の各ファイルについてを指すfoo.ext
名前のリンクが生成されます。名前は同じですが、拡張子が異なるスクリプトが複数ある場合、この操作は失敗します。foo
foo.ext
答え2
本当にやりたいなら方法がある。.bashrc
ホームディレクトリの末尾に以下を追加し、拡張子をドットPATHEXT
で区切られた拡張子に設定します:
。 (Windowsの動作と一致するようにドットを含めるように変更されました。)使用による責任はユーザー自身にあります。
if declare -f command_not_found_handle >/dev/null; then
eval "original_command_not_found_handle() $(declare -f command_not_found_handle|tail -n +2)"
fi
command_not_found_handle(){
local PATHEXT_EXPANDED i
IFS=: read -a PATHEXT_EXPANDED<<<"$PATHEXT"
for i in "${PATHEXT_EXPANDED[@]}"; do
if type "$1$i" &>/dev/null; then
"$1$i" "${@:2}"
return $?
fi
done
if declare -f original_command_not_found_handle >/dev/null; then
original_command_not_found_handle "$@"
else
return 127
fi
}
また、他のコマンドがコマンド名で始まらない場合は、Tabを使用してコマンド名を完成できることに注意してくださいmy-script
。
答え3
短い:なし
長い:シェルスクリプトにはフルファイル名が必要ですが、コマンドのエイリアスを定義してさまざまな名前で参照できます。例えば
alias my-script=my-script.pl