bashスクリプトは、スクリプトを実行するディレクトリをユーザーに知らせることができますか?

bashスクリプトは、スクリプトを実行するディレクトリをユーザーに知らせることができますか?

シェルスクリプトは、ユーザーが実行しているディレクトリを知ることができますか?私はサブディレクトリのリストを見て、そこからいくつかのgitコマンドを実行するこのようなスクリプトを開発したいと思います。 1つの方法はこれを渡すことですが、pwdいくつかの追加パラメータが必要なので、組み込み関数を使用して作業ディレクトリをインポートしたいと思います。

この例では、現在のディレクトリを想定しています。

#!/bin/bash

for d in */ ; do
  echo ""
  echo "===================="
  echo ""
  echo "$d"

  git -C "$d" remote show origin
  echo ""
  echo "===================="
  echo ""
done

答え1

POSIXシェル(例:)を実行し、POSIXシェルの特殊変数(サブプロセスから継承され、コマンド実行中に保存されるプロセス属性)bashに現在の作業ディレクトリへのパスを作成します。fish-like shell に$PWD該当するのは .csh$cwd

この変数は動的です。現在のディレクトリを変更するコマンド(またはcd(または一部のシェルでは/ pushd))を呼び出した後、その内容が変更されることがあります。popdPOSIXシェルは、$OLDPWD呼び出しが成功する前の以前の作業ディレクトリを含む変数も保持しますcdpushdpopd

このpwdコマンドは、現在のディレクトリのパスを印刷します。 POSIXシェルでは、このコマンドは通常組み込まれています$PWD

スクリプトの起動時に作業ディレクトリを知りたい場合は、次のようにスクリプトの先頭に書き込む必要があります。

#! /bin/sh -
original_PWD=$PWD
...
cd ...

親プロセスの現在の作業ディレクトリを知るために、GNU / Linuxでは次のことができます。

parent_PWD=$(readlink -ve "/proc/$PPID/cwd")

しかし、あなたはいつもこの情報にアクセスできるわけではありません。両親が帰ると、あなたはinit収穫者(ある場合)に養子になるか養子になります。しかし、$PPIDそうです。いいえ更新されるので、この場合は間違ったプロセスのcwdを取得できます(親プロセスのpidが再利用されている場合)。

答え2

もちろん、スクリプトはそれを実行しているシェル/プログラムの現在のディレクトリを継承します。したがって、スクリプトcd自体がそうしない限り、すべてのファイル名参照はそのファイル名に基づいています。スクリプトファイル自体の場所を知ることは難しく、ほとんど不可能です。

答え3

これを行う環境変数はないと思いますが、多くのコマンドなしで簡単に使用できるように自分で作成できます。

たとえば、

#!/bin/bash
starting_dir=$(pwd)  #use pwd to get the starting directory

#do things
cd some_example_dir/
#do more things

cd $starting_dir  #go back to the directory

この場合、起動ディレクトリのパスを変数に文字列として保存するだけです$starting_dir。絶対パスとして保存され、cdいつでもアクセスできます。

関連情報