2017-07-13 3 views
1

Ich habe ein Problem in Bezug auf eine Alias-Datei in /etc/profile.d/. Das ist nichts Wichtiges. Ich bin nur daran interessiert, warum es nicht wie erwartet funktioniert.Befehl funktioniert im Terminal aber nicht als Alias ​​in Profil.d

Also im Grunde habe ich die Datei 00-alias.sh bei dem oben genannten Pfad und ich wollte eine Verknüpfung, die eine bestimmte Zeile einer Datei liest. Also das ist mein Code:

alias lnn='sed -n "${1}p" < "${2}"' 

Mit diesem Code sollte ich in der Lage sein, einen Befehl wie

$ lnn 4 test.txt 

jedoch auszuführen, funktioniert das nicht. Ich bekomme einfach den Fehler

-bash: : No such file or directory


Nun dachte ich, ok, vielleicht relative Pfade funktionieren nicht, weil die Datei auf dem Pfad befindet /etc/profile.d/00-alias.sh

ich voraus Also ging und machte ein neuen Alias ​​wie

alias pwd2='echo $(pwd)' 

dann die profile.d mit

aktualisiert

source /etc/profile.d/00-alias.sh

Und gerade versuchen pwd2 aber die wiederholte den Weg, den ich zur Zeit in war. Also in der Theorie kann die Datei mit dem Befehl gefunden wird ich geschrieben habe. Ich habe immer noch versucht, die Datei an meinen Alias ​​mit absoluten Pfad wie

$ lnn 4 /var/test.txt 

weiterzugeben, die gleichen Fehler wie oben.


Aber, wenn ich den Befehl des Alias ​​im Terminal wie

sed -n "4p" < test.txt 

Es funktioniert völlig in Ordnung ein. Egal, ob ich in Anführungszeichen test.txt


setzen Und hier ist eine andere seltsame Sache: Wenn ich

alias lnn='sed -n "${1}p" < ${2}' 

ohne Anführungszeichen schreiben um ${2} ich den Fehler

-bash: ${2}: ambiguous redirect 

In der Terminal es funktioniert einfach gut ...

Also, was mache ich falsch? Hat jemand eine Idee dazu? Ich würde gerne meinen Fehler wissen. Aber wie gesagt, das ist kein echtes Problem, da ich nur neugierig bin, warum Bash sich so verhält.

+0

Wenn Sie Variablen übergeben möchten, erstellen Sie ein Skript mit dem darin enthaltenen Befehl und richten Sie dann einen Alias ​​für dieses Skript ein. Sie können die Variablen dann an den Alias ​​übergeben. –

Antwort

2

Aliase in bash nehmen keine Parameter irgendeiner Form. Speichern Sie den Schmerz und verwenden Sie stattdessen eine Funktion.

function lnn() { 
    sed -n "${1}p" < "${2}" 
} 

Fügen Sie die Funktion in der Datei 00-alias.sh und Quelle sie einmal vor die Funktion von Befehlszeile aufrufen.

source /etc/profile.d/00-alias.sh 
lnn 4 test.txt 

Weitere Informationen unter BashFAQ/80: How can I make an alias that takes an argument?

können Sie nicht. Aliases in bash sind extrem rudimentär und für einen ernsthaften Zweck nicht wirklich geeignet. Die bash Manpage sagt sogar so ausdrücklich:

Ein Auszug aus dem GNU bash man page, über Aliase

.. Es gibt keinen Mechanismus für Argumente im Ersetzungstext verwenden. Wenn Argumente benötigt werden, sollte eine Shell-Funktion verwendet werden.


Auf einer Seite zur Kenntnis das Problem nichts mit relativen Pfaden zu tun hat (oder), so, nur nicht vergessen, Aliase sind nicht in Skripten erlaubt. Sie sind nur in interaktiven Shells erlaubt. Wenn Sie ein Skript schreiben, verwenden Sie stattdessen immer eine Funktion.

+0

Vielen Dank! Das hat vollkommen gut funktioniert. Ich wusste nicht, dass Argumente nicht erlaubt sind. Sie sollten wahrscheinlich erwähnen, dass die Zeile 'alias lnn = 'lnn'' immer noch benötigt wird. (Zumindest für mich funktioniert es nur mit dieser Zeile) – NullDev

+0

@NullDev: Sobald Sie die Funktion der Datei hinzufügen und sie ausliefern, wird die Funktion in der aktuellen Shell verfügbar gemacht, so dass Sie die Aliasdefinition nicht benötigen. ;) – Inian

+0

Ja, ich habe das aber immer noch "mehrdeutige Umleitung" erhalten. Vielleicht wurde die Datei nicht korrekt neu geladen – NullDev

Verwandte Themen