シェルスクリプトのコマンドpwd
は、シェルスクリプトがあるディレクトリを出力しますか?
ここには、3つの独立した「ディレクトリ」があります。
それらが独立していることを示すために、/ tmp/pwd.shに保存された以下を含むシェルスクリプトを記述できます。
#!/bin/sh
pwd
cd /var
pwd
次に、pwd(上記の#1)を/に変更します。
cd /
そしてスクリプトを実行します:
/tmp/pwd.sh
これは、既存のpwdをデモンストレーションすることから始まり(#1)、それを/ varに変更して再度表示します(#2)。これらのpwd
はいずれも、/ tmp/pwd.shを含むディレクトリ「/ tmp」ではありません(#3)。
シェルスクリプトのコマンドpwdは、シェルスクリプトがあるディレクトリを返しますか?
番号。
最初に、定義上、シェルスクリプトまたはシェルコマンドは、0〜255の数値の終了ステータス以外のものを返しません。これは公理的ですが、一般に、これらの種類の質問をしたときに意味するものではありません。
次に、pwd
は Bourne Shell builtin であり、標準のシステムバイナリでもあります。いずれかprints論理または物理現在の作業ディレクトリ。
現在のスクリプトのディレクトリが必要な場合は、以下の最後のセクションで説明するように、dirname
ユーティリティを使用します。
pwd
のクイックテスト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_SOURCEに関するセクション)と、readlink
およびrealpath
は、Edgeのケースが何であるかを完全に理解するためのものです。
ただし、日常のスクリプトでは、$0
のディレクトリコンポーネントで、知りたいことを十分に伝えることができます。 $0
が実際に必要な情報を保持しておらず、次のようなより複雑な構成が必要な場合に、複雑なことを行っている場合:
echo $(dirname "$(realpath "$0")")
そして、あなたはおそらくあなたの人生を必要以上に難しくしているのでしょう。
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
cwd
と呼ばれるこの概念があり、実行中のすべてのプロセスが追跡します。
言い換えれば、カーネルは各プロセスのcwd
の考えを保持しています。
その =で読み取ることができます (/ procを備えたシステムの場合):
readlink /proc/$PID_of_PROCESS/cwd
実行中のシェル(そのPIDは$$である必要があります)の場合:
$ readlink /proc/$$/cwd
シェルは、変数$ PWDとコマンドpwd
で同じ情報を追跡します(たまに同期が取れなくなることがあります)。
$ cd /tmp; echo "Present working directory: $PWD"
Present working directory: /tmp
$ cd /tmp; echo "Current working directory: $(pwd)"
Current working directory: /tmp
したがって、pwd
コマンドは各プロセスのcwd
を表示します。
The place each process stands inside the directory tree.
シェル、スクリプト、またはプロセスがcd
を実行するたびに、これらのすべての変数が更新されます(一部の例外的なケースを除く)。
シェルは、たとえばcd /tmp
を実行することにより、pwd
を変更できます。
スクリプトは、実行中のシェルにpwd
をcd /tmp
に変更するように指示することもできます。
または、他のc
プロセスがカーネルを呼び出して、cd /tmp
に相当するものを実行する場合もあります。
すべての場合において、カーネルcwd
および(プロセスがシェルの場合)シェルのpwd
が更新されます。
スクリプトが存在する場所ではなく、呼び出された場所から実行されます。
ここに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