ここでは、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 シェルのビルトインであり、標準のシステム バイナリでもあります。どちらかが印刷 論理的または物理的な現在の作業ディレクトリ 、これは通常:
現在のスクリプトのディレクトリが必要な場合は、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
の man ページ と realpath
いくつかあるエッジケースが何であるかをより完全に理解すること。
ただし、日常のスクリプトでは、$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