スクリプトの最後のフォルダなしで現在のパスを取得する方法は?

スクリプトの最後のフォルダなしで現在のパスを取得する方法は?

スクリプトが実行されるフォルダ自体を除いて、現在のパスを変数に保存するスクリプトを実行したいと思います。例:

/tmp/test/test2/test3/test.sh

path=$PWD
echo $path

しかし、/tmp/test/test2/test3shスクリプトを含むフォルダを除外したいと思います。

だから私が望む結果は次のとおりです。 /tmp/test/test2

答え1

あなたはそれを使用することができます

dir=${PWD%/*}    # or:  dir=$( dirname "$PWD" )

または

dir="$PWD/.."

または

dir=".."

最初のケースでは、PWD現在の作業ディレクトリを含む変数を/使用して、最後のディレクトリとそれ以降のすべてのエントリを削除して親ディレクトリへのパスを取得します。

2番目の場合、PWD変数は単に上記のディレクトリへのパスを作成するために使用されます..

3番目のケースでは、現在のディレクトリへの相対パスを使用して上記のディレクトリを参照するだけです。

どの代替を使用するかは、パスを使用したいターゲットによって異なります。

例:

$ echo $PWD
/tmp/shell-sh.jAtMYgn0
$ dir=${PWD%/*}
$ echo "$dir"
/tmp
$ dir="$PWD/.."
$ echo "$dir"
/tmp/shell-sh.jAtMYgn0/..
$ dir=".."
$ echo "$dir"
..

答え2

次のコードを試してください。

dirname "$(pwd)"
  • dirname - ファイル/ディレクトリパスからサフィックスを削除する

答え3

存在するzsh

dir=$PWD:h

同様に、dirname最後にディレクトリコンポーネントを削除します$PWD。この場合と同じになります$PWD/$dir/dirname

利点よりも1つ

dir=$(dirname -- "$PWD")

$PWDdirname が改行で終わっても、それでも機能します。

必ずしも現在のディレクトリの親ディレクトリである必要はありません。たとえば、とがシンボリックリンク$PWDの場合、現在のディレクトリの親ディレクトリはそうではありません。親ディレクトリを取得するには、次のようにします。/tmp/tmp/var/tmp/var/

dir=$PWD/..
dir=$dir:P

または:

dir=$PWD:P:h

:P修飾子は$dir標準パスを生成します(すべてのシンボリックリンク...GNUなどのコンポーネントを確認しますreadlink -f))。

またはPOSIXとして:

dir=$(cd -P .. && pwd -P)

とにかく、$PWDスクリプト内のパスはスクリプトとは何の関係もないことに注意してください。スクリプトを含むディレクトリの親ディレクトリが必要な場合は、そのディレクトリ$0:P:h:hzsh

答え4

現在の作業ディレクトリは/home/dev/otherです。

dir=$PWD

親ディレクトリ

parentdir="$(dirname "$dir")"`

関連情報