bash / zsh-Alias: Kann ich die Argumente packen und innerhalb der Subshell verwenden?

1051
tgm1024

Ich möchte einen Alias, der eine Verzeichnisliste in Wörterbuchreihenfolge mit "." Dateien zuerst. Es scheint, dass es ein paar Möglichkeiten gibt, dieses Skript ohne Schreiben eines eigenen Skripts (was kein wirkliches Problem ist) zu erreichen, darin, das Gebietsschema festzulegen LC_ALL="C". (Dies ist auf der Sortier-Manpage und auf mehreren anderen Websites).

Wenn Sie jedoch das Gebietsschema auf "C" setzen, kann (und wird) einige Softwareinstallationen beschädigt werden. Meine kurzfristige Lösung ist also ähnlich (Dies ist ohne die zusätzlichen Optionen von ls, der Kürze halber):

alias ls='(LC_ALL="C"; /bin/ls)'

Dies erlaubt jedoch nicht, dass Argumente in die Subshell "übergeben" werden.

Das funktioniert natürlich nicht:

alias ls='(LC_ALL="C"; /bin/ls $*)'

Gibt es eine Möglichkeit, mit einem einfachen Alias ​​damit umzugehen? (Im Gegensatz zum Schreiben eines Shell-Skripts / einer Funktion, was ich tun kann).

7

1 Antwort auf die Frage

10
mpy

Sie benötigen keine Subshell. Sie können die Umgebung nur für den folgenden Befehl ändern, indem Sie dem Befehl die Zuweisung der Variablen ohne Semikolon voranstellen . Vergleichen Sie zum Beispiel die Ausgabe von

LC_ALL=C env | grep LC_ALL 

mit der Ausgabe von

env | grep LC_ALL 

Um es kurz zu machen, sollte der folgende Alias ​​für Sie funktionieren:

alias ls='LC_ALL=C /bin/ls' 

Ich habe es /bin/lswie in Ihrem Beispiel verwendet, aber wie von Kamil Maciorowski in einem Kommentar zu einer anderen Antwort erwähnt, könnte Ihr eingegebener lsBefehl auch ein Alias ​​sein, also sollten Sie diese Alternative auch in Betracht ziehen:

alias ls='LC_ALL=C ls' 
Heilige Cripes! Das ist es, was ich für so viel Zeit in csh / tcsh bekomme. Ich muss die bash- und zsh-Dokumentation ein Dutzend Mal durchgelesen haben, um danach zu suchen und sie nicht gefunden zu haben. Unglaublich. Vielen Dank! tgm1024 vor 6 Jahren 0
Als schnelle Ergänzung zur Verwendung von 'ls' anstelle der vollqualifizierten `/ bin / ls'-Direktausführung. Dies ist etwas, was ich normalerweise trotzdem vorschlage. In den meisten Fällen möchte ich einfach nicht, dass jemand anderes das macht, was ein Dienstprogramm tun soll. Es stellt sich eine offene Frage, was in Zukunft schief gehen könnte. Der Verweis auf `/ bin / ls` ist beabsichtigt und was ich anderen vorschlagen kann. tgm1024 vor 6 Jahren 0