Windows環境変数PATHEXTに相当するUnixはありますか


11

Windows環境変数に相当するUnixがあるかどうか疑問に思っていますPATHEXT

Windowsの背景がない場合:PATHEXTcmd.exeにそのサフィックスを入力せずにスクリプトを実行できるようにするファイルサフィックスを追加します。たとえば、私のWindowsコンピューターでは、PATHEXTにサフィックスが含まれており.pl、cmd.exeでPerlスクリプトを実行したい場合は、単に入力するだけでmy-script実行されます。それでも、bashで同じスクリプトを実行するには、完全な名前を記述する必要がありますmy-script.pl

私は現在WindowsとUnixの両方で作業しているため、ほとんどの場合、Unixボックスに再び行くときにサフィックスを入力するのを忘れるという罠に陥ります。


たとえば、PATHEXTに.shと.plが含まれていて、foo.shとfoo.plが含まれているディレクトリで 'foo'を実行しようとした場合、Windowsが何をしたかを知ることは興味深いでしょう。
ジェフシャラー

.sh先行する場合.plfoo.sh実行されます。stackoverflow.com/a/7839178/180275
ルネNyffenegger

回答:


7

短い:いいえ

より長い:シェルスクリプトには完全なファイル名が必要ですが、コマンドにエイリアスを定義して、さまざまな名前でそれらを参照できます。例えば

alias my-script=my-script.pl

12

最も簡単な解決策は、スクリプトに拡張機能を使用しないことです。それらは必要ではなく、コンピュータに対してではなく、スクリプトの種類を識別するためにのみ役立ちます。Windowsは拡張子を使用してファイルタイプを識別しますが、* nixシステム(などの例外はほとんどありgzipません)は識別しません。

バイナリは一切持っていないことに注意してください.exe* nixのでは拡張子が、それらは単に呼ばれているfoo、ではありませんfoo.exe。したがって、foo.plとして実行可能にする場合は、最初の場所とfoo同じようfooにファイルを保存します。

または、何らかの理由で本当に拡張機能が必要な場合は、スクリプトを保存したディレクトリに移動して、次のコマンドを実行します。

for f in *.*; do ln -s "$f" "${f%%.*}"; done

これにより、拡張子が付いたすべてのファイルが繰り返されfoo.ext、それらのファイルごとに、fooを指すと呼ばれるリンクが作成されfoo.extます。同じ名前で拡張子が異なる複数のスクリプトがある場合、これは失敗することに注意してください。


7

あなたが本当にそれをしたいなら、方法があります。以下を.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
}

また、で始まる別のコマンドがない場合は、タブを使用してコマンド名を完成させることもできますmy-script

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.