Ich möchte einen Bash-Alias für grep erstellen, der Zeilennummern hinzufügt:
alias grep='grep -n'
Aber das fügt natürlich auch den Pipelines Zeilennummern hinzu. Die meiste Zeit (und es fallen mir keine Ausnahmen ein) möchte ich keine Zeilennummern in einer Pipeline haben (zumindest intern, wahrscheinlich in Ordnung, wenn es die letzte ist), und ich möchte nicht wirklich ein sed / awk / cut hinzufügen die Pipeline nur, um sie herauszunehmen.
Vielleicht könnten meine Anforderungen vereinfacht werden, um "nur Zeilennummern hinzuzufügen, wenn grep der einzige Befehl in der Zeile ist". Gibt es eine Möglichkeit, dies ohne einen besonders hässlichen Alias zu tun?
quelle
[[ -t 0 && -t 1 ]]
wenn Sie nur Zeilennummern wünschen, wenn sowohl die Standardeingabe als auch die Standardausgabe an ein Terminal angeschlossen sind.(zur Vollständigkeit)
Während die Antwort von @enzotib höchstwahrscheinlich das ist, was Sie wollen, ist es nicht das, wonach Sie gefragt haben.
[ -t 1 ]
prüft, ob es sich bei dem Dateideskriptor um ein Endgerät handelt, nicht um eine andere Pipe (wie eine normale Datei, einen Socket, einen anderen Gerätetyp wie/dev/null
...)Der
[
Befehl hat keine Entsprechung-t
außer für Pipes. Um den Dateityp zu ermitteln, der einem Dateideskriptor zugeordnet ist, müssen Sie denfstat()
Systemaufruf für diesen ausführen . Dafür gibt es keinen Standardbefehl, aber einige Systeme oder Shells haben einen.Mit GNU
stat
:Oder mit
zsh
und seinem eigenenstat
Builtin (das ein paar Jahre älter ist als GNU), hier nur geladen alszstat
:Nun ein paar Anmerkungen:
Es sind nicht nur Shell- Pipelines , die Pipelines verwenden.
oder:
oder:
laufen Sie auch
grep
mit seinem stdout, das zu einem Rohr geht.ksh93
Beachten Sie, dass Ihre Shell auf einigen Systemen Socket-Paare anstelle von Pipes in ihren Pipelines verwendet.quelle