pwd は何を出力しますか?

pwd は何を出力しますか?

シェル スクリプト内のコマンドは、pwdシェル スクリプトがあるディレクトリを出力しますか?

答え1

ここでは、3 つの独立した「ディレクトリ」が機能します。

  1. 現在のシェルの現在の作業ディレクトリ、
  2. シェルスクリプトの現在の作業ディレクトリ、および
  3. シェル スクリプトを含むディレクトリ。

これらが独立していることを示すために、次の内容を含むシェル スクリプトを記述して /tmp/pwd.sh に保存します。

#!/bin/sh
pwd
cd /var 
pwd

次に、パスワード (上記の #1) を / に変更できます。

cd /

スクリプトを実行します:

/tmp/pwd.sh

これは、既存の pwd (#1) を表示することから始まり、次にそれを /var に変更して再度表示します (#2)。これらのどちらも、pwd/tmp/pwd.sh (#3) を含むディレクトリである "/tmp" ではありませんでした。

答え2

現在の作業ディレクトリ

シェル スクリプト内のコマンド pwd は、シェル スクリプトがあるディレクトリを返しますか?

いいえ。

まず、定義により、シェル スクリプトまたはシェル コマンドは、0 から 255 までの数値の終了ステータス以外のものを返しません。これは自明ですが、一般的に、人々がこの種の質問をするときに意味するものではありません。

pwd第二に、Bourne シェル組み込み標準システムバイナリ。プリント論理的または物理的現在の作業ディレクトリ一般的には次のようになります。

  1. スクリプトまたはバイナリを呼び出すときのディレクトリ構造内の場所。
  2. 作業ディレクトリを変更した後の現在の場所CDまたは、pushd や popd など、現在の作業ディレクトリを変更するその他のユーティリティや組み込みコマンド。

現在のスクリプトのディレクトリが必要な場合は、dirname以下の最後のセクションで説明されているユーティリティを使用します。

クイックテストpwd

簡単なテストとしてパスワード実際に印刷するには、以下を実行できます。

# Create a shell script containing pwd.
cat <<-EOF > /tmp/test_pwd.sh
#!/bin/sh

pwd
EOF

# Make the script executable.
chmod 755 /tmp/test_pwd.sh

# Go somewhere on the filesystem, and call the test script.
cd /etc
/tmp/test_pwd.sh

現在の作業ディレクトリが であるため、/etcではなく が出力されます。 これは想定された動作です。/tmp/etc

スクリプトを含むディレクトリを取得する

おそらく、現在のスクリプトのディレクトリを見つけたいために、この質問をしているのでしょう。一般的なケースでは、以下が手っ取り早い解決策です。

#!/usr/bin/env bash
echo $(dirname "$0")

これが機能するのは、$0一般に には実行中のスクリプトを呼び出すために使用されるパス名が含まれており、シェル拡張ではdirnameユーティリティを使用してファイル名部分を除いたパスを返すためです。Bash パラメータ拡張を使用して同様の操作を行うことができますが、移植性は低くなります"${0%/*}"

もちろん、これはすべて非常に単純化されたものです。Bash マニュアル(特に位置パラメータ、特殊パラメータ、およびBASH_ソース) および のマニュアル ページを参照しreadlinkて、realpathエッジ ケースが何であるかをより深く理解してください。エッジ ケースにはいくつかあります。

ただし、日常のスクリプトでは、 のディレクトリ コンポーネントだけで、$0知りたい情報を得ることができます。 では$0実際に必要な情報が保持されないほど複雑な処理を行っている場合は、次のようなより複雑な構造が必要になります。

echo $(dirname "$(realpath "$0")")

そうであれば、おそらく自分の人生を必要以上に困難にしていることになります。

答え3

pwd現在の作業ディレクトリを開けない場合を除いて 0 を返します。

mkdir /tmp/d; cd "$_"
pwd && pwd -P; echo "$?"
rmdir ../d
pwd && pwd -P; echo "$?"

/tmp/d
/tmp/d
0
/tmp/d
pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
1

答え4

スクリプトがある場所ではなく、呼び出された/実行された場所のディレクトリを返します。

try.sh は次のとおりです:

echo "The current working directory: $PWD"

この出力により、次のことがより明確になります。

[akarpe@ADM-PROD-OMNI ~]$ sh try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ sh try/try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ sh ./try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ sh ./try/try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ cd try
[akarpe@ADM-PROD-OMNI try]$ sh ./try.sh
The current working directory: /mnt/home/akarpe/try
[akarpe@ADM-PROD-OMNI try]$ sh ../try.sh
The current working directory: /mnt/home/akarpe/try

関連情報