Gibt es ein Unix-Äquivalent zur Windows-Umgebungsvariablen PATHEXT?

11

Ich frage mich, ob es ein Unix-Äquivalent für die Windows-Umgebungsvariable gibt PATHEXT.

Für Benutzer ohne Windows-Hintergrund: Durch Hinzufügen eines Dateisuffixes PATHEXTkann ich ein Skript ausführen, ohne dieses Suffix in cmd.exe einzugeben. Auf meinem Windows-Computer enthält PATHEXT beispielsweise das Suffix. .plWenn ich ein Perl-Skript in cmd.exe ausführen möchte, kann ich einfach eingeben my-scriptund es wird ausgeführt. Um dasselbe Skript in bash auszuführen, muss ich jedoch den vollständigen Namen schreiben : my-script.pl.

Da ich derzeit sowohl unter Windows als auch unter Unix arbeite, gerate ich fast immer in die Falle, dass ich vergesse, das Suffix einzugeben, wenn ich wieder zu einer Unix-Box gehe.

René Nyffenegger
quelle
Es wäre interessant zu wissen, was Windows getan hat, wenn PATHEXT beispielsweise .sh und .pl enthält und Sie versucht haben, 'foo' in einem Verzeichnis mit foo.sh und foo.pl auszuführen.
Jeff Schaller
Wenn .shvorher .pl, foo.shwird ausgeführt. stackoverflow.com/a/7839178/180275
René Nyffenegger

Antworten:

7

kurz: nein

länger: Shell-Skripte erfordern einen vollständigen Dateinamen, aber Sie können Aliase definieren, damit Ihre Befehle mit verschiedenen Namen auf sie verweisen. Beispielsweise

alias my-script=my-script.pl
Thomas Dickey
quelle
12

Die einfachste Lösung besteht darin, keine Erweiterungen für Ihre Skripte zu verwenden. Sie sind nicht erforderlich und dienen nur dazu, den Typ des Skripts für Sie zu identifizieren, nicht jedoch für den Computer. Während Windows Erweiterungen verwendet, um den Dateityp zu identifizieren, gziptun dies * nix-Systeme (mit sehr wenigen Ausnahmen wie ) nicht.

Beachten Sie, dass Binärdateien .exein * nix keine Erweiterung haben. Sie werden nur aufgerufen foo, nicht foo.exe. Wenn Sie also foo.plals ausführbar sein möchten foo, speichern Sie die Datei einfach als fooerstes.

Wenn Sie die Erweiterungen aus irgendeinem Grund wirklich benötigen, wechseln Sie in das Verzeichnis, in dem Sie Ihre Skripte speichern, und führen Sie Folgendes aus:

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

Dadurch werden alle Dateien mit Erweiterungen durchlaufen und für jede Datei foo.extwird ein Link erstellt, fooder auf verweist foo.ext. Beachten Sie, dass dies fehlschlägt, wenn Sie mehrere Skripte mit demselben Namen, aber unterschiedlichen Erweiterungen haben.

terdon
quelle
7

Wenn Sie es wirklich wollen, gibt es einen Weg. Fügen Sie am Ende von .bashrcin Ihrem Home-Verzeichnis Folgendes hinzu und setzen Sie PATHEXTauf Erweiterungsnamen mit durch getrennten Punkten :. (Die Punkte wurden geändert, um sie an das Windows-Verhalten anzupassen.) Die Verwendung erfolgt auf eigenes Risiko.

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
}

Denken Sie auch daran, dass Sie den Befehlsnamen mithilfe der Registerkarte vervollständigen können, wenn es keinen anderen Befehl gibt, der ebenfalls mit beginnt my-script.

user23013
quelle