GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ein Shell-Dotfile für Sie tun kann

Fragen Sie nicht, was Sie für Ihr Shell-Dotfile tun können, sondern was ein Shell-Dotfile für Sie tun kann!

Ich war überall auf der OS-Karte, aber in den letzten Jahren waren meine täglichen Fahrer Macs. Lange Zeit habe ich Bash verwendet, aber als ein paar Freunde anfingen, zsh zu missionieren, habe ich es versucht. Es dauerte nicht lange, bis ich es zu schätzen wusste, und einige Jahre später bevorzuge ich es für viele der kleinen Dinge, die es tut.

Ich habe zsh (bereitgestellt über Homebrew, nicht das installierte System) und die Erweiterung Oh My Zsh verwendet.

Die Beispiele in diesem Artikel sind für meine persönliche .zshrc . Die meisten funktionieren direkt in Bash, und ich glaube nicht, dass sich einige auf Oh My Zsh verlassen, aber Ihre Laufleistung kann variieren. Es gab eine Zeit, in der ich eine Shell-Punktdatei sowohl für zsh als auch für Bash verwaltete, aber schließlich gab ich meine .bashrc auf .

Wir sind alle verrückt hier

Wenn Sie die Möglichkeit haben möchten, dasselbe Dotfile für alle Betriebssysteme zu verwenden, sollten Sie Ihrem Dotfile ein wenig mehr Geschick geben.

### Mac Specifics
if [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac-specific stuff here.
fi

Zum Beispiel erwarte ich, dass die Alt + Pfeiltasten den Cursor um das Wort und nicht um ein einzelnes Leerzeichen bewegen. Um dies in iTerm2 (meiner bevorzugten Shell) zu erreichen, füge ich dieses Snippet dem Mac-spezifischen Teil meiner .zshrc:

hinzu
### Mac Specifics
if [[ "$OSTYPE" == "darwin"* ]]; then
        ### Mac cursor commands for iTerm2; map ctrl+arrows or alt+arrows to fast-move
        bindkey -e
        bindkey '^[[1;9C' forward-word
        bindkey '^[[1;9D' backward-word
        bindkey '\e\e[D' backward-word
        bindkey '\e\e[C' forward-word
fi

Was ist mit Bob?

Während ich mein Shell-Dotfile lieben lernte, wollte ich nicht, dass auf meinen Heimcomputern immer dieselben Dinge verfügbar sind wie auf meinen Arbeitscomputern. Eine Möglichkeit, dies zu lösen, besteht darin, zusätzliche Punktdateien zu haben, die zu Hause, aber nicht bei der Arbeit verwendet werden können. So habe ich das erreicht:

if [[ `egrep 'dnssuffix1|dnssuffix2' /etc/resolv.conf` ]]; then
        if [ -e $HOME/.work ]
                source $HOME/.work
        else
                echo "This looks like a work machine, but I can't find the ~/.work file"
        fi
fi

In diesem Fall trenne ich mein Arbeits-DNS-Suffix (oder mehrere Suffixe, abhängig von Ihrer Situation) und beziehe eine separate Datei, die mein Leben bei der Arbeit ein wenig besser macht.

Das, was du tust

Jetzt ist wahrscheinlich ein guter Zeitpunkt, um die Verwendung der Tilde (~ ), um Ihr Home-Verzeichnis beim Schreiben von Skripten darzustellen. Sie werden feststellen, dass es einige Kontexte gibt, in denen es nicht erkannt wird. Sich daran gewöhnen, die Umgebungsvariable $HOME zu verwenden erspart Ihnen später viel Zeit bei der Fehlersuche und Kopfschmerzen.

Die logische Erweiterung wäre, betriebssystemspezifische Punktdateien einzufügen, wenn Sie dazu geneigt sind.

Erinnerung, ganz allein im Mondlicht

Das Linux-Terminal

  • Die 7 besten Terminalemulatoren für Linux
  • 10 Befehlszeilentools für die Datenanalyse unter Linux
  • Jetzt herunterladen:SSH-Spickzettel
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Linux-Befehlszeilen-Tutorials

Ich habe peinliche Mengen an Muscheln geschrieben und bin zu dem Schluss gekommen, dass ich wirklich nicht mehr schreiben möchte. Es ist nicht so, dass Shell die meiste Zeit nicht das tun kann, was ich brauche, aber ich finde, wenn ich Shell schreibe, schlage ich wahrscheinlich eine Klebebandlösung zusammen, anstatt das Problem dauerhaft zu lösen.

Ebenso hasse ich es, Dinge auswendig zu lernen, und im Laufe meiner Karriere musste ich im Laufe eines Tages radikale Kontextverschiebungen vornehmen. Die praktische Konsequenz ist, dass ich im Laufe der Jahre viele Dinge mehrmals neu lernen musste. ("Warte... welche For-Schleifen-Struktur verwendet diese Sprache?")

Also entscheide ich hin und wieder, dass ich es leid bin, nachzuschlagen, wie man etwas wieder macht. Eine Möglichkeit, mein Leben zu verbessern, besteht darin, Aliase hinzuzufügen.

Ein häufiges Szenario für jeden, der mit Systemen arbeitet, ist herauszufinden, was die gesamte Festplatte belegt. Leider konnte ich mir diese Beschwörung nie merken, also habe ich einen Shell-Alias ​​namens bigdirs erstellt :

alias bigdirs='du --max-depth=1 2> /dev/null | sort -n -r | head -n20'

Obwohl ich weniger faul sein und es mir tatsächlich merken könnte, nun, das ist einfach nicht der Weg von Unix ...

Tippfehler und die Menschen, die sie lieben

Eine andere Möglichkeit, wie Shell-Aliase mein Leben verbessern, besteht darin, mich vor Tippfehlern zu bewahren. Ich weiß nicht warum, aber ich habe diese unangenehme Angewohnheit entwickelt, ein w einzugeben nach der Sequenz ea , wenn ich also mein Terminal löschen möchte, gebe ich oft cleawr ein . Leider sagt das nichts zu meiner Shell. Bis ich dieses kleine Goldstück hinzufüge:

alias cleawr='clear'

In einem Fall, in dem Windows einen gleichwertigen, aber besseren Befehl hat, tippe ich cls ein . Es ist frustrierend zu sehen, wie Ihre Muschel ihre Hände hochwirft, also füge ich hinzu:

alias cls='clear'

Ja, ich kenne ctrl + l , aber ich benutze es nie.

Amüsieren Sie sich

Arbeit kann stressig sein. Manchmal muss man einfach ein bisschen Spaß haben. Wenn Ihre Shell den Befehl nicht kennt, sollte sie das einfach tun , vielleicht möchten Sie gleich mit den Schultern zucken! Sie können dies mit einer Funktion tun:

shrug() { echo "¯\_(ツ)_/¯"; }

Wenn das nicht funktioniert, müssen Sie vielleicht eine Tabelle umdrehen:

fliptable() { echo "(╯°□°)╯ ┻━┻"; } # Flip a table. Example usage: fsck -y /dev/sdb1 || fliptable

Stellen Sie sich meinen Ärger und meine Frustration vor, als ich einen Schreibtisch umdrehen musste und mich nicht erinnern konnte, wie ich ihn genannt hatte. Also habe ich weitere Shell-Aliase hinzugefügt:

alias flipdesk='fliptable'
alias deskflip='fliptable'
alias tableflip='fliptable'

Und manchmal muss man feiern:

disco() {
        echo "(•_•)"
        echo "<)   )╯"
        echo " /    \ "
        echo ""
        echo "\(•_•)"
        echo " (   (>"
        echo " /    \ "
        echo ""
        echo " (•_•)"
        echo "<)   )>"
        echo " /    \ "
}

Normalerweise leite ich die Ausgabe dieser Befehle an pbcopy  weiter und fügen Sie es in das relevante Chat-Tool ein, das ich verwende.

Ich habe diese lustige Funktion von einem Twitter-Account namens „Command Line Magic:“ @climagic, dem ich folge. Da ich jetzt in Florida lebe, bin ich sehr froh, dass dies der einzige Schnee in meinem Leben ist:

snow() {
        clear;while :;do echo $LINES $COLUMNS $(($RANDOM%$COLUMNS));sleep 0.1;done|gawk '{a[$3]=0;for(x in a) {o=a[x];a[x]=a[x]+1;printf "\033[%s;%sH ",o,x;printf "\033[%s;%sH*\033[0;0H",a[x],x;}}'
}

Spaß mit Funktionen

Wir haben einige Beispiele von Funktionen gesehen, die ich verwende. Da nur wenige dieser Beispiele ein Argument erfordern, könnten sie als Aliase verwendet werden. Ich verwende Funktionen aus persönlichen Vorlieben, wenn es sich um mehr als eine einzelne kurze Anweisung handelt.

Zu verschiedenen Zeiten meiner Karriere habe ich Graphite betrieben, eine Open-Source-Lösung für skalierbare Zeitreihenmetriken. Es gab genug Fälle, in denen ich einen metrischen Pfad (mit Punkten abgegrenzt) in einen Dateisystempfad (mit Schrägstrichen abgegrenzt) oder umgekehrt transponieren musste, dass es nützlich wurde, dedizierte Funktionen für diese Aufgaben zu haben:

# Useful for converting between Graphite metrics and file paths
function dottoslash() {
        echo $1 | sed 's/\./\//g'
}
function slashtodot() {
        echo $1 | sed 's/\//\./g'
}

Zu einer anderen Zeit in meiner Karriere habe ich viel Kubernetes betrieben. Wenn Sie mit der Ausführung von Kubernetes nicht vertraut sind, müssen Sie viel YAML schreiben. Leider ist es nicht schwer, ungültiges YAML zu schreiben. Schlimmer noch, Kubernetes validiert YAML nicht, bevor es versucht, es anzuwenden, sodass Sie nicht feststellen, dass es ungültig ist, bis Sie es anwenden. Es sei denn, Sie validieren es zuerst:

function yamllint() {
        for i in $(find . -name '*.yml' -o -name '*.yaml'); do echo $i; ruby -e "require 'yaml';YAML.load_file(\"$i\")"; done
}

Weil ich es leid war, mich in Verlegenheit zu bringen und gelegentlich das Setup eines Kunden zu beschädigen, schrieb ich dieses kleine Snippet und fügte es als Pre-Commit-Hook zu allen meinen relevanten Repos hinzu. Etwas Ähnliches wäre im Rahmen Ihres kontinuierlichen Integrationsprozesses sehr hilfreich, insbesondere wenn Sie als Teil eines Teams arbeiten.

Oh, Finger, wo bist du?

Ich war einst ein ausgezeichneter Tippschreiber. Diese Zeiten sind lange vorbei. Ich habe mehr Tippfehler gemacht, als ich für möglich gehalten hätte.

Zu unterschiedlichen Zeiten habe ich ziemlich viel von Chef oder Kubernetes verwendet. Zu meinem Glück habe ich nie beides gleichzeitig verwendet.

Teil des Chef-Ökosystems ist Test Kitchen, eine Suite von Tools, die das Testen erleichtern und mit den Befehlen kitchen test aufgerufen werden . Kubernetes wird mit einem CLI-Tool kubectl verwaltet . Beide Befehle erfordern mehrere Unterbefehle und rollen beide nicht besonders flüssig von den Fingern.

Anstatt einen Haufen „Tippfehler-Aliase“ zu erstellen, habe ich diese Befehle in k umbenannt :

alias k='kitchen test $@'

oder

alias k='kubectl $@'

Zeitsplitter

In der letzten Hälfte meiner Karriere habe ich mehr Code mit anderen Leuten geschrieben. Ich habe in vielen Umgebungen gearbeitet, in denen wir Kopien von Repos auf unserem Konto gegabelt haben und Pull-Requests als Teil des Überprüfungsprozesses verwenden. Wenn ich sicherstellen möchte, dass mein Fork eines bestimmten Repos auf dem neuesten Stand ist, verwende ich fetchupstream :

alias fetchupstream='git fetch upstream && git checkout master && git merge upstream/master && git push'

Meine Augen haben die Herrlichkeit des Kommens der Farbe gesehen

Ich mag Farbe. Es kann Dinge wie Diffs benutzerfreundlicher machen.

alias diff='colordiff'

Ich dachte, dass kolorierte Handbuchseiten ein netter Trick sind, also habe ich diese Funktion eingebaut:

# Colorized man pages, from:
# http://boredzo.org/blog/archives/2016-08-15/colorized-man-pages-understood-and-customized
man() {
        env \
                LESS_TERMCAP_md=$(printf "\e[1;36m") \
                LESS_TERMCAP_me=$(printf "\e[0m") \
                LESS_TERMCAP_se=$(printf "\e[0m") \
                LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
                LESS_TERMCAP_ue=$(printf "\e[0m") \
                LESS_TERMCAP_us=$(printf "\e[1;32m") \
                man "$@"
}

Ich liebe den Befehl which . Es teilt Ihnen einfach mit, woher im Dateisystem der Befehl kommt, den Sie ausführen – es sei denn, es handelt sich um eine Shell-Funktion. Nach mehreren kaskadierenden Punktdateien ist manchmal nicht klar, wo eine Funktion definiert ist oder was sie tut. Es stellt sich heraus, dass der whence und type Befehle können dabei helfen.

# Where is a function defined?
whichfunc() {
        whence -v $1
        type -a $1
}

Schlussfolgerung

Ich hoffe, dass dieser Artikel Ihnen hilft und Sie dazu inspiriert, Wege zu finden, wie Sie Ihre tägliche Shell-Nutzung verbessern können. Sie müssen nicht riesig, neuartig oder komplex sein. Sie können ein kleines, aber häufiges Problem lösen, eine Abkürzung schaffen oder sogar eine Lösung zur Reduzierung häufiger Tippfehler bieten.

Sie können gerne mein Dotfiles-Repo durchsehen, aber ich warne Sie, dass es eine Menge Aufräumarbeiten gebrauchen könnte. Fühlen Sie sich frei, alles zu verwenden, was Sie hilfreich finden, und seien Sie bitte exzellent zueinander.


Linux
  1. Was ist Ihre Lieblings-Shell für die Arbeit als Systemadministrator?

  2. Benötigen Sie eine Shell für SCP?

  3. Was können Sie mit einem VPS und einem Cloud-Server machen?

  4. Transliterationsskript für die Linux-Shell

  5. Was ist usage() im Shell-Scripting?

Was ist Subshell in Linux?

Was ist die Login-Shell in Linux?

Beste Kommentarsysteme für Websites, die Sie selbst hosten können

SystemD - Wofür wird SystemD verwendet?

Die 5 besten Schachspiele für Linux, die Sie in Ihrer Freizeit ausprobieren können

Was ist eine .sh-Datei?