
シェルスクリプトのコマンドは、pwd
シェルスクリプトを含むディレクトリを出力しますか?
答え1
これには3つの別々の「ディレクトリ」があります。
- 現在のシェルの現在の作業ディレクトリ、
- シェルスクリプトの現在の作業ディレクトリ
- シェルスクリプトを含むディレクトリです。
これらが独立していることを証明するために、以下を含む/tmp/pwd.shに格納されているシェルスクリプトを作成できます。
#!/bin/sh
pwd
cd /var
pwd
その後、パスワード(上記の#1)を/に変更できます。
cd /
スクリプトを実行します。
/tmp/pwd.sh
まず、既存のパスワードをデモしてから(#1)、/ varに変更して再度表示します(#2)。これらのどれもpwd
/tmp/pwd.sh(#3) を含むディレクトリ "/tmp" ではありません。
答え2
現在(または現在)の作業ディレクトリ
シェルスクリプトのpwdコマンドは、シェルスクリプトを含むディレクトリを返しますか?
いいえ。
まず、定義に応じて、シェルスクリプトまたはシェルコマンドは、0から255までの数字の終了状態を除いて何も返しません。これは自明ですが、一般的に人々がこの種の質問をするときに意味するものではありません。
第二に、pwd
両方です。Bourne シェル内蔵標準システムバイナリ。誰でも印刷論理的または物理的現在の作業ディレクトリ、一般的に:
- スクリプトまたはバイナリが呼び出されたときのディレクトリ構造内の場所。
- 作業ディレクトリの変更後の現在位置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_SOURCEreadlink
)だけでなく、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