Wie bekomme ich nur den aktuellen Arbeitsverzeichnisnamen in einem Bash-Skript oder noch besser nur einen Terminalbefehl?.
pwd
gibt den vollständigen Pfad des aktuellen Arbeitsverzeichnisses an, z. /opt/local/bin
aber ich will nur bin
Keine Notwendigkeit für basename und insbesondere keine Notwendigkeit für eine Subshell mit pwd (die fügt eine zusätzliche und teure Fork-Operation hinz ); Die Shell kann dies intern mit Parametererweiterung tun:
result=${PWD##*/} # to assign to a variable
printf '%s\n' "${PWD##*/}" # to print to stdout
# ...more robust than echo for unusual names
# (consider a directory named -e or -n)
printf '%q\n' "${PWD##*/}" # to print to stdout, quoted for use as Shell input
# ...useful to make hidden characters readable.
Beachten Sie, dass Sie möglicherweise alle abschließenden Schrägstriche entfernen müssen, wenn Sie diese Technik unter anderen Umständen anwenden (nicht PWD
, sondern eine andere Variable, die einen Verzeichnisnamen enthält). Das Folgende verwendet bashs Extglob-Unterstützung , um auch mit mehreren abschließenden Schrägstrichen zu arbeiten:
dirname=/path/to/somewhere//
shopt -s extglob # enable +(...) glob syntax
result=${dirname%%+(/)} # trim however many trailing slashes exist
result=${result##*/} # remove everything before the last / that still remains
printf '%s\n' "$result"
Alternativ ohne extglob
:
dirname="/path/to/somewhere//"
result="${dirname%"${dirname##*[!/]}"}" # extglob-free multi-trailing-/ trim
result="${result##*/}" # remove everything before the last /
Verwenden Sie das Programm basename
. Für Ihren Fall:
% basename "$PWD"
bin
$ echo "${PWD##*/}"
Für den Fall, dass Sie nicht mehr weiterkommen möchten
Sie können eine Kombination aus pwd und basename verwenden. Z.B.
#!/bin/bash
CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`
echo "$BASENAME"
exit;
Wie wäre es mit grep:
pwd | grep -o '[^/]*$'
Ich mag die ausgewählte Antwort (Charles Duffy), aber seien Sie vorsichtig, wenn Sie sich in einem verknüpften Verzeichnis befinden und den Namen des Zielverzeichnisses wünschen. Leider glaube ich nicht, dass dies mit einem einzelnen Parameter-Erweiterungsausdruck möglich ist, vielleicht irre ich mich. Das sollte funktionieren:
target_PWD=$(readlink -f .)
echo ${target_PWD##*/}
Um dies zu sehen, ein Experiment:
cd foo
ln -s . bar
echo ${PWD##*/}
meldet "bar"
So zeigen Sie die führenden Verzeichnisse eines Pfades an (ohne einen Fork-Exec von/usr/bin/dirname):
echo ${target_PWD%/*}
Dies wird z.B. transformiere foo/bar/baz -> foo/bar
echo "$PWD" | sed 's!.*/!!'
Wenn Sie Bourne Shell verwenden oder ${PWD##*/}
nicht verfügbar ist.
Dieser Thread ist großartig! Hier ist noch eine Geschmacksrichtung:
pwd | awk -F / '{print $NF}'
basename $(pwd)
oder
echo "$(basename $(pwd))"
Überraschenderweise erwähnte niemand diese Alternative, die nur eingebaute Bash-Befehle verwendet:
i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}"
Als zusätzlicher Bonus können Sie den Namen des übergeordneten Verzeichnisses leicht erhalten mit:
[ "${#p[@]}" -gt 1 ] && echo "${p[-2]}"
Diese funktionieren mit Bash 4.3-alpha oder neuer.
ich benutze dies normalerweise in sh-Skripten
SCRIPTSRC=`readlink -f "$0" || echo "$0"`
RUN_PATH=`dirname "${SCRIPTSRC}" || echo .`
echo "Running from ${RUN_PATH}"
...
cd ${RUN_PATH}/subfolder
sie können dies verwenden, um Dinge zu automatisieren ...
Für die Findjockeys da draußen wie ich:
find $PWD -maxdepth 0 -printf "%f\n"
Unten grep mit Regex funktioniert auch,
>pwd | grep -o "\w*-*$"
basename "$PWD"
ODER
IFS=/
var=($PWD)
echo ${var[-1]}
Setzen Sie das interne Dateinamentrennzeichen (IFS) wieder in ein Leerzeichen.
IFS=
Nach dem IFS = steht ein Leerzeichen.
Ich bevorzuge die Verwendung von gbasename
, das Teil von GNU coreutils ist.
Sie können das Dienstprogramm basename verwenden, mit dem alle Präfixe, die mit/enden, und das Suffix (falls in string vorhanden) aus string gelöscht und das Ergebnis in der Standardausgabe ausgegeben werden.
$basename <path-of-directory>
Benutz einfach:
pwd | xargs basename
oder
basename "`pwd`"