回答:
basenameの必要はなく、特にpwdを実行するサブシェルは不要です(これにより、余分で高価なfork操作が追加されます)。シェルはこれをパラメーター拡張を使用して内部的に実行できます。
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.
このテクニックを他の状況で適用している場合(ではなくPWD
、ディレクトリ名を保持している他の変数)、末尾のスラッシュを削除する必要がある場合があることに注意してください。以下は、bashのextglobサポートを使用して、複数の末尾のスラッシュでも機能します。
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"
または、なしextglob
:
dirname="/path/to/somewhere//"
result="${dirname%"${dirname##*[!/]}"}" # extglob-free multi-trailing-/ trim
result="${result##*/}" # remove everything before the last /
$PWD
は、組み込みのbash変数の名前です。すべての組み込み変数名は、すべて大文字です(ローカル変数と区別するために、常に少なくとも1つの小文字が必要です)。result=${PWD#*/}
は評価されません/full/path/to/directory
。代わりに、最初の要素のみを取り除いて作成しpath/to/directory
ます。2つの#
文字を使用すると、パターンは貪欲に一致し、できるだけ多くの文字に一致します。詳細については、回答にリンクされているパラメーター展開ページをご覧ください。
pwd
は、の値と常に同じであるとは限らないことに注意してください。これは、シンボリックリンクを介すること、bashにオプションが設定されているかどうか$PWD
などによって複雑になるためです。これは、自動マウントされたディレクトリの処理に関して特に厄介なものでした。論理パスではなく物理パスを記録すると、パスが生成され、オートマウンタが使用しているディレクトリを自発的にマウント解除できるようになります。cd
-o physical
sh
でcsh
、バックスペースキーを機能させるには、stty
manページ全体を読む必要があり、気に入った」と言っていたかもしれません。
basename
プログラムを使用します。あなたの場合:
% basename "$PWD"
bin
basename
プログラムの目的ではありませんか?引用符がないこと以外に、この答えの何が問題になっていますか?
basename
確かに正しいことをする外部プログラムですが、実行中の任意のもののbashのために外部プログラムは、アウト・オブ・ボックス行うことができる唯一の組み込み機能が愚かで使用して、(パフォーマンスへの影響を被るfork()
、execve()
、wait()
のために、など)理由はありません。
basename
ここにはいないに適用されますdirname
ので、dirname
機能がある${PWD##*/}
のスラッシュなしで文字列を変換する-しない.
例えばを、。したがって、dirname
外部ツールとして使用するとパフォーマンスのオーバーヘッドが発生しますが、それを補うのに役立つ機能もあります。
function
キーワードはPOSIXと互換性がなく、標準化された構文に値を追加せず、引用符がないと、スペースを含むディレクトリ名にバグが発生します。wdexec() { "./$(basename "$PWD")"; }
望ましい代替手段かもしれません。
basename
は「効率的」ではありません。しかし、醜いbash構文に比べて覚えやすいので、開発者の生産性の点でおそらくより効率的です。覚えているなら、頑張ってね。それ以外の場合basename
も同様に機能します。誰かがbashスクリプトの「パフォーマンス」を改善してより効率的にしなければならなかったことがありますか?
$ echo "${PWD##*/}"
echo "${PWD##*/}"
。
name=${PWD##*/}
は正しく、name=$(echo "${PWD##*/}")
間違っています(不必要な非効率的な意味で)。
pwdとbasenameの組み合わせを使用できます。例えば
#!/bin/bash
CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`
echo "$BASENAME"
exit;
私は選択した回答(Charles Duffy)が好きですが、シンボリックリンクされたディレクトリにいて、ターゲットディレクトリの名前が必要な場合は注意してください。残念ながら、それは単一のパラメーター展開式では実行できないと思います。おそらく私は間違っています。これはうまくいくはずです:
target_PWD=$(readlink -f .)
echo ${target_PWD##*/}
これを見るには、実験:
cd foo
ln -s . bar
echo ${PWD##*/}
「バー」を報告する
パスの先頭ディレクトリを表示するには(/ usr / bin / dirnameのfork-execを発生させずに):
echo ${target_PWD%/*}
これは、例えばfoo / bar / baz-> foo / barを変換します
readlink -f
はGNU拡張機能であるため、BSD(OS Xを含む)では使用できません。
echo "$PWD" | sed 's!.*/!!'
Bourneシェルを使用している場合、または${PWD##*/}
使用できない場合。
${PWD##*/}
POSIX sh-すべての最新の/ bin / sh(ダッシュ、アッシュなどを含む)がサポートしています。最近のボックスで実際のボーンをヒットするには、少し古いSolarisシステムを使用する必要があります。それを超えて- echo "$PWD"
; 引用符を省略するとバグが発生します(ディレクトリ名にスペース、ワイルドカード文字などが含まれている場合)。
驚いたことに、組み込みのbashコマンドのみを使用するこの代替案については誰も言及していません。
i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}"
追加ボーナスとして、親ディレクトリの名前を簡単に取得できます。
[ "${#p[@]}" -gt 1 ] && echo "${p[-2]}"
これらはBash 4.3-alpha以降で動作します。
使用する:
basename "$PWD"
または
IFS=/
var=($PWD)
echo ${var[-1]}
内部ファイル名区切り(IFS)をスペースに戻します。
IFS=
IFSの後にスペースが1つあります。
basename $(pwd)
または
echo "$(basename $(pwd))"
pwd
に渡される前に文字列分割され、グロブ展開されbasename
ます。
basename "$(pwd)"
- basename "$PWD"
それはjust に比べて非常に非効率的ですが、それ自体は、呼び出しbasename
を行う代わりにパラメーター展開を使用することに比べて非効率的です。
私のようなそこにいるジョッキーを見つけるために:
find $PWD -maxdepth 0 -printf "%f\n"
$PWD
に"$PWD"
正しく珍しいディレクトリ名を処理するために。
ただ使用する:
pwd | xargs basename
または
basename "`pwd`"
xargs
ディレクトリ名にリテラルの改行または引用文字が含まれ、2番目の公式がpwd
コマンドを呼び出す場合、formultionは非効率的でバグが多いです組み込みの変数展開を介して同じ結果を取得するのではなく、サブシェルで。
bashプロンプト領域の現在のディレクトリのみを表示したい場合は、で.bashrc
ファイルを編集できます~
。次の行に変更\w
し\W
ます。
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
実行するsource ~/.bashrc
と、プロンプト領域にディレクトリ名のみが表示されます。
参照:https : //superuser.com/questions/60555/show-only-current-directory-name-not-full-path-on-bash-prompt
私gbasename
は、GNU coreutilsの一部であるを使用することを強くお勧めします。
basename
ているだけです。これは通常gbasename
、MacOSや、GNU以外のベース名で出荷される他のプラットフォームでのみ呼び出されます。
次のコマンドを実行すると、現在の作業ディレクトリがbashスクリプトで出力されます。
pushd .
CURRENT_DIR="`cd $1; pwd`"
popd
echo $CURRENT_DIR
$1
現在の作業ディレクトリを含むようなものであることをどこで確認しているのかわかりません。(2)pushd
およびはpopd
ここでは何の目的も果たしません。これは、バッククォート内のすべてがサブシェルで行われるためです。つまり、最初は親シェルのディレクトリに影響を与えることはできません。(3)を使用"$(cd "$1"; pwd)"
すると、空白を含むディレクトリ名に対してより読みやすく、復元力があります。