UnixにはWindows環境変数PATHEXTに対応する変数はありますか?

UnixにはWindows環境変数PATHEXTに対応する変数はありますか?

Windows環境変数に対応するUnixがあるかどうか疑問に思いますPATHEXT

Windowsの背景知識がない場合:ファイルサフィックスを追加すると、PATHEXTcmd.exeにサフィックスを入力せずにスクリプトを実行できます。たとえば、私のWindowsコンピュータでは、PATHEXTにはサフィックスが含まれており、.plcmd.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名前のリンクが生成されます。名前は同じですが、拡張子が異なるスクリプトが複数ある場合、この操作は失敗します。foofoo.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

関連情報