回答:
のようなものを処理する必要はありません~
。シェルが処理します。これが~/filename
、任意のスクリプトまたはプログラムに渡して機能する理由です。これらのプログラムはすべて~
自分自身を処理せず、シェルが引数をに変換し、/home/username/filename
代わりにプログラムに渡します。
$ echo ~/filename
/home/mrozekma/filename
正規のファイル名(などを含まないファイル名)が必要な場合は..
、realpath
(Neilに感謝)を使用します。
$ realpath ~/../filename
/home/filename
パスをディレクトリ名とファイル名に分割するには、andを使用dirname
しbasename
ます:
$ dirname /foo/bar/baz
/foo/bar
$ basename /foo/bar/baz
baz
realpath
方が優れていますが、readlink
試してみるとうまくいくようです。失敗する例を知っていますか?
cd /tmp; touch foo; ln -s foo bar; cd; readlink /tmp/bar
。これはfoo
をrealpath
返し/tmp/foo
、が返されます。
readlink -f
注-f
)はとほぼ同等でrealpath
、より移植性があります。GNUcoreutilsでは、readlink -f
他のいくつかのシステムにも存在します。realpath
個別にパッケージ化されており、インストールされていない可能性があります(たとえば、Ubuntu 10.04またはDebian lennyでは、5つの一般的でないパッケージに依存しています)。
Michaelが述べたようにdirnameとbasenameを使用することは、必要なものを取得するための最も安全な方法です。
とにかく、本当に「bash only tools」でこれを実行したい場合は、パラメーター置換を使用できます。
echo `basename $PWD` # Basename of current working directory.
echo "${PWD##*/}" # Basename of current working directory.
echo
echo `basename $0` # Name of script.
echo $0 # Name of script.
echo "${0##*/}" # Name of script.
echo
filename=test.data
echo "${filename##*.}" # data
# Extension of filename.
この例は、一見に値するAdvanced Bash Scripting Guideから直接引用したものです。
説明は非常に簡単です:
$ {var#Pattern} $ varのフロントエンドと一致する$ Patternの最も短い部分を$ varから削除します。$ {var ## Pattern} $ varから、$ varのフロントエンドと一致する$ Patternの最も長い部分を削除します。
いくつかの正規表現のようなパターンとを見てください#
または##
貪欲/非貪欲修飾のいくつかの種類として。
これは、パスパーツのさらに複雑な抽出を行う必要がある場合に役立ちます。
${...##...}
と友人ではなく、dirname
そしてbasename
、彼らはすべてのケースでは動作しません。たとえば、両方の${0##*/}
と${0%/*}
同じに展開する$0
場合は$0
含まれていません/
。
${0%/*}
がに代わるものではないのか理解していdirname
ます。ただし、${0##*/}
代わりにを使用することの何が問題になっていbasename
ますか?
$0
、末尾にが付いたディレクトリ名である場合です/
。しかし、私は私の助言を後悔しdirname
ます。
realpath
実際のパスを通知するコマンドです(..およびシンボリックリンクなどを削除します)。
FreeBSDの標準です。この議論によると、それはLinuxでも利用可能です:
http://www.unix.com/shell-programming-scripting/89294-geting-real-path.html
その議論はbashソリューションも提供します:
$ bash -c "cd /foo/../bar/ ; pwd"