Shell-Hacks für Bash und Fish (Teil 1)

  Incisor   Lesezeit: 2 Minuten  🗪 5 Kommentare

Unser Gastautor stellt ein kleines Tool zum effizienten Arbeiten in der Konsole vor.

shell-hacks für bash und fish (teil 1)

Beim Arbeiten in der Konsole möchte man oft etwas mit der zuletzt modifizierten Datei machen. Hierfür kann eine kleine Bash-Funktion "lf" für "last file" geschrieben werden, welche schlicht den Namen der neuesten (bzw. zuletzt modifizierten) Datei zurückgibt. Übergibt man ein Argument, wird dies als auf die Datei anzuwendenes Kommando aufgefasst.

Hierfür legt man eine ausführbare Datei namens "~/.local/bin/lf" mit folgendem Inhalt an:

#!/bin/sh
# File: "~/.local/bin/lf
# Usage: lf [cmd [options]...] will execute cmd with the last modified file as argument

newest=
dir=`pwd`

# default command: just show the file
if [ $# -eq 0 ]; then
        set -- ls;
fi

# find newest file
for f in "$dir"/*; do
    if [ -f "$f" ]; then
        if [ -z "$newest" ] || [ "$f" -nt "$newest" ]; then
                newest="$f"
        fi
    fi
done
if ! [ -e "$newest" ]; then
        exit 1
fi

# run command on newest file
"$@" "$newest"

Möchte man das ganze in der Fish-Shell benutzen, muss zusätzlich eine Umleitung in einer der Konfigurationsdateien von Fish, also zum Beispiel ~/.config/fish/config.fish angelegt werden:

function lf
  bash -c '$HOME/.local/bin/lf "$@"' _ $argv
end

Diese eignet sich auch dafür, andere Bash-Funktionen in Fish einzupflegen.

Vorsicht ist geboten, wenn man in Verzeichnissen mit Schreibvorgängen anderer Programme oder Benutzer unterwegs ist, da die "neueste Datei" eventuell nicht die anvisierte Datei ist.

Tags

bash, fish, Shell, Konsole, Terminal, LF, last file

kamome
Geschrieben von kamome am 29. August 2023 um 18:57

Nette Idee! Ich würde es lieber nf nennen (newest file), da für mich lf (last file) eher nach „last access“ klingt (das können wir aufgrund der üblichen mount-Option noatime vergessen).

Außerdem würde ich es stattdessen in eine kurze Funktion in der .bashrc (o. ä.) packen:

nf(){ [ $# -eq 0 ] && cmd="ls" || cmd="$@"; $cmd $(ls -tr |tail -n 1);}

Aufruf dann gleich.

Für mich häufiger nötig ist allerdings „die Datei, die ich im letzten Befehl verwendet habe“: Die erhält man (in Bash) mit !$, genau genommen das letzte Argument des letzten Befehls, also z. B. nach einem ls /ganz/langer/komplizierter/pfad/datei.adoc ein Bearbeiten mit editor !$; mit einem alias e='editor' geht es noch kürzer mit e !$ :) Sollen es alle Argumente des letzten Befehls sein, entsprechend mit !*.

P. S.: Für einen solchen Kommentar vermisse ich die Vorschaufunktion vorm Abschicken schon – hoffen wir, dass es gutgeht ;)

kamome
Geschrieben von kamome am 30. August 2023 um 09:15

Schade, im Code hat das nicht ganz funktioniert … Viele hier wissen es vielleicht, aber die obigen „Ampersand…Semikolon“ sind zu ersetzen durch:

amp: Ampersand
quot: einfaches (englisches) Anführungszeichen

Rolf
Geschrieben von Rolf am 19. September 2023 um 07:56

Danke! Das $! für letztes Argument des letzten Befehls kannte ich noch nicht. Weißt du zufällig wie das in fish gemacht wird?

madbehaviorus
Geschrieben von madbehaviorus am 27. Dezember 2023 um 09:41

Interessant zu erwähnen ist vielleicht noch, dass bei vielen debianbasierten Distributionen in der .bashrc das entsprechenden PATH Argument für die Anwendun fehlt:

echo 'PATH="$HOME/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc source ~/.bashrc

madbehaviorus
Geschrieben von madbehaviorus am 27. Dezember 2023 um 09:42

gemeint war natürlich

echo 'PATH="$HOME/bin:$HOME/.local/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc