bashの別のディレクトリからコマンドを実行する


119

私がこれをやっていると言ってください:

cd subdir
git init
cd ../

コマンドを実行するためにディレクトリを出入りするのではなく、1つまたは2つのコマンドでこれを行う方法はありますか?

(git固有のソリューションを探していません;これは単なる例です。)

回答:


202

多くの場合、これが最良の方法です。

( cd dir ; git init )

または

( cd dir && git init )

それは非常に短く、入力が簡単です。サブシェルが起動するため、そこから環境を変更することはできませんが、ここでは問題にならないようです。


1
環境変数を1つまたは2つ設定する必要がある場合は、先頭に別のコマンドとして追加してください。
カバ

1
@CraigMcQueen:そうでもない。$?サブシェルで実行された最後のコマンドの終了コードが含まれます。&&バリアントを使用する場合(通常はそうする必要があります)、失敗した最初のコマンドの終了コードを取得します(すべてが正常に実行された場合は0になります)。
マット

括弧はオプションだと思います
-Francis.Beauchamp

10
@ Francis.Beauchamp:括弧を省略すると、開始した場所に戻るのではなく、コマンドの後のサブディレクトリに移動します。
マット

Windowsでこれを行うにはどうすればよいですか?
カールモリソン

22

パスからgitコマンドを実行し、別のパスでリポジトリを変更する方法を探していました。だから私はここでこの質問に終わった。

しかし、私の特定のニーズのために、受け入れられた答えも他のものも役に立たなかった。

sudo -u USER /usr/bin/git(実行中の別のユーザー)を使用してgitコマンドを実行する必要がありました。あなたが知っているかもしれないように、sudoは私が実行することはできませんcdコマンドを、私はできませんことリポジトリのディレクトリに。

それで、gitのmanページに行きました。そして、オプションの中で、私は見ました--git-dir=<path>

--git-dir =

リポジトリへのパスを設定します。これは、GIT_DIR環境変数を設定することでも制御できます。現在の作業ディレクトリへの絶対パスまたは相対パスを指定できます。

だから、それが誰かを助けるなら、あなたはまだパスからgitを使用し、「あなたから遠く離れた」リポジトリに変更を加えることができます。ただ使用する:

git --git-dir=/path/to/repository GIT_COMMAND

または、別のユーザーとして実行するには、次のようにします。

echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository GIT_COMMAND

また、からのgit-のinitのmanページ

$ GIT_DIR環境変数が設定されている場合、リポジトリのベースに./.gitの代わりに使用するパスを指定します。

したがって、通常の.gitフォルダーの下でリポジトリを初期化する場合は、--git-dirオプションと一緒に指定する必要があります。例えば:

echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init

でリポジトリを初期化した後、それ以降の/path/to/repo/.gitすべてのコマンドには--work-tree=<path>、gitのマニュアルページで説明されているように、オプションが必要です。

--work-tree =

作業ツリーへのパスを設定します。絶対パスまたは現在の作業ディレクトリからの相対パスを指定できます。これは、GIT_WORK_TREE環境変数とcore.worktree構成変数を設定することでも制御できます(詳細については、git-config(1)のcore.worktreeを参照してください)。

したがって、別のユーザーとしてgitを実行し、新しいリポジトリを初期化する正しいコマンドは次のとおりです。

echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' add /path/to/repository/*
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' commit -m 'MESSAGE'
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' remote add origin user@domain.com:path
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' push -u origin master

スクリプトを使用せずにsudoをインタラクティブに使用している場合は、単に行うsudo -isudo su、インタラクティブなルートシェルを取得することができます。
バグスター

なぜ機能しないのか想像できません( cd subdir && sudo -u USER /usr/bin/git init )
スコット

アクセス許可がない場合はどうなりますsubdirか?
dmmd

13

まさにあなたが求めているものではありません(サブシェルで上記の本当の答えがあります)がpushdpopd


私はmavenにcd &&を試してみましたが、うまくいきませんでしたが、pushdとpopdは完璧に仕事をします。ありがとう
ラドゥトーダー

6

いくつかのオプションがあります。&&またはでコマンドをグループ化できます;。このような:

cd subdir && git init && cd ..

または

cd subdir; git init; cd ..

これらの違いは、最初の例では、コマンドの1つが失敗した場合、残りのコマンドは実行されないことです。2番目の例では、すべてのコマンドが何であれ実行されます。

別のオプションは、関数を定義してそれを使用することです。例えば:

function cdinit() {
    cd $1
    git init
    cd ..
}

その後、次のコマンドを実行できます。

cdinit subdir

そして、自動的git initにそのディレクトリに移動し、そこから移動します。

多数のディレクトリがありgit init、1つのコマンドでそれらを使用する場合は、関数を使用してより複雑なソリューションを実行することもできます。

function cdinit() {
    for arg in $@
    do
        cd $arg
        git init
        cd ..
    done
}

次に、これを次のコマンドで実行できます。

cdinit subdir1 subdir2 subdir3

そして、それは何だろうgit initではsubdir1subdir2subdir3


ありがとう。とに気付いていましたが&&;もっとエレガントなものを望んでいました。スクリプトを書くことは私の最善の選択肢のようです。
トレバーバーナム

訂正:この答えは問題ありませんが、Matの答えは私の特定のニーズにより適しています。
トレバーバーナム

cdinit関数を任意のコマンドに一般化できると思いますか?引数だけを使ってみましたが、うまくいきませんでした。
チェタンバシン

(1)改行はと同等;であるため、3行関数はと同等cd $1; git init; cd ..です。(2)あなたは、変数を引用する必要があります"$1""$@""$arg"。それとも、短縮することができますfor arg in "$@"for arg
スコット

5

以下の場合にはgit(少なくともバージョン2.7.0)で、あなたが利用することができ-C、それが与えられたディレクトリで開始されたかのようにgitの振る舞いになりオプションを選択します。したがって、ソリューションは次のようになります。

> git -C subdir init
Initialized empty Git repository in /some/path/subdir/.git/

ドキュメントの引用:

Run as if git was started in <path> instead of the current working directory. When multiple -C options are given, each subsequent non-absolute -C
<path> is interpreted relative to the preceding -C <path>.

This option affects options that expect path name like --git-dir and --work-tree in that their interpretations of the path names would be made
relative to the working directory caused by the -C option. 

2

コマンドを&&でグループ化できます。つまり、

cd subdir && git init && cd ../

各コマンドの終了コードに依存しない場合は、;を使用できます。代わりに、すなわち:

cd subdir ; git init ; cd ../

1
または;、前の戻りコードに依存しないようにします。
-slhck

(1)  cd subdir && git init ; cd ..実際には最も意味があります。ユーザーがでgit initコマンドを実行したい場合、subdirおそらく現在のディレクトリでコマンドを実行したくないでしょう。つまり、(最初の)cdが失敗した場合に実行したくないということです。(既ににいるcdので失敗する可能性はあり  ますが、それはコーナーケースです。)…(続き)subdir
Scott

(続き)…ただし、ユーザーが3つのコマンドのブロックを1つの単位として扱いたいcd場合は、git initコマンドが失敗しても開始ディレクトリにバックアップすることをお勧めし  ます。(または、サブディレクトリにとどまってコマンドの失敗を診断することもできます。)(2)/after  を含める必要はありません..
スコット

2

コマンドにファイル名またはディレクトリ名のパラメータがない場合は、ターゲットディレクトリに移動する必要があります。

ただし、ターゲットディレクトリとコマンドをパラメーターとして受け取るbashスクリプトを作成できます。これについては、pushdとpopdをご覧くださいhttp ://ss64.com/bash/pushd.html

私はあなたのためにその小さなスクリプトを書きますが、ここにはLinuxボックスがありません:)


マーク・シマンスキーからの答えを見ました。コマンドに2番目のパラメーターを実装するだけで(コマンドの名前を変更できます)、必要なものが得られます。
wullxz

1

プログラムには引数を処理するさまざまな方法があるため、-folder = nameオプションに相当するものがいくつかあります。その例外を越えて、標準は、MS DOSでさえ、単に

$ プログラムのサブディレクトリ

時々あなたが必要です

$ program subdir /

プログラムはフォルダを開き、ファイルを操作するのと同じように操作し、終了したら、元の標準ディレクトリを指すシェルに制御を戻します。この方法で処理されるプログラムには、エラー出力(コアダンプなど)がシェルの現在のディレクトリ(subdirではなく)のファイルに送られるという問題があります

プログラムに別の場所を指定するためのコマンドスイッチがない限り、回避策はありません。一部のプログラマーは、「ディレクトリプログラムの呼び出し元」と「ディレクトリプログラムがで動作するように指示された」との間で芸術的なライセンスを取得しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.