Website-Suche

Nützliche Bash-Befehlszeilen-Tipps und Tricks Beispiele - Teil 4


In Fortsetzung unserer Serie über nützliche Tipps und Tricks zur Bash-Befehlszeile werden wir im heutigen Artikel untersuchen, wie Sie nur das greppen, was Sie benötigen, und beginnen mit einer Einführung in pwd und wie Sie den Pfad ermitteln, von dem aus ein Skript gestartet wurde.

In diesem Tutorial lernen Sie:

  • Nützliche Tipps, Tricks und Methoden zur Bash-Befehlszeile
  • So interagieren Sie mit der Bash-Befehlszeile auf fortgeschrittene Weise
  • Wie du deine Bash-Fähigkeiten insgesamt schärfst und ein kompetenterer Bash-Benutzer wirst

Nützliche Bash-Befehlszeilen-Tipps und Tricks Beispiele – Teil 4

Verwendete Softwareanforderungen und Konventionen

Beispiel 1: Pfad-Arbeitsverzeichnis? Oder nicht?

Wir sind vielleicht daran gewöhnt, pwd auf der Kommandozeile aufzurufen, um uns den Namen unseres aktuellen Verzeichnisses mitzuteilen:

pwd
/home/roel/workspace

Wenn wir jedoch das Verzeichnis abrufen möchten, aus dem ein Skript gestartet wurde, funktioniert die Verwendung dieser Variablen aus einem Skript auf die gleiche Weise?

cat test_pwd.sh 
#!/bin/bash
MY_PATH1="${PWD}"
echo "${MY_PATH1}"
MY_PATH2="$(pwd)"
echo "${MY_PATH2}"

Wir werden zwei Möglichkeiten verwenden, um den Pfad abzurufen: Wir schauen (für die erste MY_PATH1 Zuweisung) auf die automatisch voreingestellte Variable PWD (OS-Ebene), und im zweiten Fall (für die zweite MY_PATH2 Zuweisung) führen wir pwd in einer Subshell ($ (...)) aus und weisen es MY_PATH2 zu. Lassen Sie uns das Gleiche ausführen:

./test_pwd.sh 
/home/roel/workspace
/home/roel/workspace

Sieht doch gut aus, oder? Ja, vielleicht, aber sobald wir in ein anderes Verzeichnis wechseln und das Skript mit seinem vollständigen oder relativen Pfadnamen aufrufen, gibt die PWD-Variable (oder der pwd-Befehl) innerhalb des Skripts das Verzeichnis zurück, in dem wir uns befanden, als das Skript gestartet wurde. Lassen Sie uns dies überprüfen:

mkdir test
cd test
../test_pwd.sh
/home/roel/workspace/test
/home/roel/workspace/test

Was wir hier sehen können, ist, dass pwd (oder die Variable $PWD) immer den tatsächlichen aktuellen Pfad zurückgibt.

Dies kann ein Problem sein: Wir möchten möglicherweise ein Subscript starten oder auf eine Datei zugreifen, und zwar aus demselben Verzeichnis (oder einem Unterverzeichnis davon), in dem sich das Skript befand. Dies ist häufig der Fall bei komplexeren Bash-Skripten, die mehrere tiefgestellte und/oder Daten- und Konfigurationsdateien aufrufen.

Was ist also eine einheitliche Methode, um den Pfad zu erhalten, von dem aus das Skript gestartet wurde?

Man kann in Erwägung ziehen, den Befehl dirname "\$0" zu verwenden:

cat test2.sh 
#!/bin/bash
echo "\$0"
dirname "\$0"

Dirname gibt den – relativen – Verzeichnisnamen jeder Option zurück, die an ihn übergeben wird, und in diesem Fall ist das \$0 – eine spezielle Variable, die beim Start eines Skripts auf den Namen des Skripts gesetzt wird, wie es gestartet wurde. Lassen Sie es uns testen:

./test2.sh 
./test2.sh
.
cd test
../test2.sh 
../test2.sh
..

Besser, nehme ich an, und es mag ein wenig helfen (hauptsächlich, um eine Idee zu bekommen), aber es gibt uns immer noch keinen vollständig qualifizierten Pfadnamen. Zu diesem Zweck können wir einen doppelten Subshell-Wrapper um dirname in Kombination mit einem tatsächlichen vollqualifizierten Pfad verwenden, der aus einer pwd-Ausführung abgerufen wurde:

cat make_it_work.sh 
#!/bin/bash
MY_PATH="$(cd "$(dirname "\$0")" && pwd)"
echo "${MY_PATH}"

Mal sehen, ob es funktioniert:

./make_it_work.sh 
/home/roel/workspace

So weit so gut, aber funktioniert es, wenn Sie es aus einem Unterverzeichnis ausführen?

cd test && pwd
/home/roel/workspace/test
../make_it_work.sh 
/home/roel/workspace
/home/roel/workspace/make_it_work.sh 
/home/roel/workspace

Ja!

Wir wechseln zuerst in test und überprüfen, ob wir uns im Testverzeichnis befinden, wenn der Befehl zum Ändern des Verzeichnisses (cd) erfolgreich war (wie von && angewiesen).

In beiden Fällen – unabhängig davon, ob es sich um einen relativen Aufruf handelt (.. /) oder mit einem vollqualifizierten Pfadnamen (/home/roel/workspace/), das Ergebnis ist, dass wir das Verzeichnis sehen, aus dem das Skript gestartet wurde (/home/roel/workspace/) und nicht das tatsächliche aktuelle Arbeitsverzeichnis oder pwd (/home/roel/workspace/test).

Zusammenfassend lässt sich sagen, dass Sie das Einzeiler-Skript MY_PATH="&#36 (cd "&#36 (dirname "\$0")" && pwd)" verwenden können, um den korrekten, vollständig qualifizierten Verzeichnisnamen aus Ihren Skripten heraus zu erhalten. Danach funktioniert die Verwendung einer relativen Addition gut. Sie können z. B. $ {MY_PATH}/include/mysubscript.sh und sogar $ {MY_PATH}/.. verwenden. /one_dir_up_file.txt usw.

Beispiel 2: Greppen Sie nur das, was Sie brauchen

Haben Sie jemals grep verwendet? Grep ist ein vielseitiges Bash-Befehlszeilenprogramm, mit dem Sie Text aus einer Datei einfach auswählen können. Meistens wird es wie folgt verwendet:

cat test
line 1 my line
line 2 your lines
line 3 our line
grep 'line 2' test
line 2 your lines

Wir haben eine Eingabedatei mit 3 Zeilen und suchen in dieser Datei nach einem bestimmten Test (Zeile 2). Aber wie wäre es, wenn Sie nur die Linien wollen, die das erwähnte Vielfache der Geraden (d.h. Linien) in sich haben? Und wie wäre es, wenn Sie nur das Wort davor haben wollten, einschließlich des Zeilenbits, aber nicht die tatsächliche Ausgabe von Zeile x?

In diesem Fall können wir nur nach dem suchen, was wir brauchen, indem wir die Option -o ('nur') für grep verwenden:

grep -o 'lines' test
lines
grep -o '\w\+ lines' test
your lines

Bingo! Wir haben zuerst nur nach dem Wort "Linien" gesucht, das gefunden wurde. Wir haben dem dann ein Leerzeichen und einen regulären Ausdruck vorangestellt, der im Pseudotext besagt: Finde eine Wortgrenze (\w), mindestens einmal und so oft wie möglich (\+), gefolgt von einem Leerzeichen. Das Ergebnis ist, dass your (das zwei Wortgrenzen hat: ein Anfang und ein Ende) enthalten ist. Linie 2 ist nicht im Lieferumfang enthalten. Es gibt zwar Wortgrenzen, aber es gibt kein Suffix von Zeilen.

Wenn Sie mehr über reguläre Ausdrücke in Bash erfahren möchten, lesen Sie bitte Bash Regexps für Anfänger mit Beispielen, Fortgeschrittene Bash Regex mit Beispielen und vielleicht gefallen Ihnen auch die semi-verwandten Python Regular Expressions mit Beispielen.

Schlussfolgerung

In diesem Artikel haben wir pwd untersucht und uns angesehen, wie man pwd aus einem Skript heraus in Kombination mit dirname verwendet, um den vollqualifizierten Verzeichnispfad abzurufen, von dem aus das Skript gestartet wurde, und zwar auf eine Weise, die immer funktioniert. Wir haben uns auch angesehen, nur das zu greppen, was wir mit der Option -o und in diesem Fall mit regulärem Ausdruck benötigen, um Wortgrenzen abzugleichen.

Hinterlassen Sie uns einen Kommentar mit Ihren besten Tipps und Tricks zur Bash-Befehlszeile!

  • Nützliche Beispiele für Bash-Befehlszeilentipps und -tricks – Teil 1
  • Nützliche Beispiele für Bash-Befehlszeilentipps und -tricks – Teil 2
  • Nützliche Bash-Befehlszeilen-Tipps und -Tricks Beispiele – Teil 3
  • Nützliche Bash-Befehlszeilen-Tipps und Tricks, Beispiele – Teil 4
  • Nützliche Beispiele für Bash-Befehlszeilentipps und -tricks – Teil 5

Verwandte Artikel: