Bash içindeki başka bir dizinden bir komut çalıştır


113

Bunu yaptığımı söyle:

cd subdir
git init
cd ../

Bunu bir komutu çalıştırmak için bir dizine girip çıkarmak yerine tek bir komutla veya belki de iki ile yapmanın bir yolu var mı?

(Git'e özgü bir çözüm aramıyorum; bu sadece bir örnek.)

Yanıtlar:


194

Bu genellikle en iyi yoldur:

( cd dir ; git init )

veya

( cd dir && git init )

Oldukça kısa ve yazması kolay. Bir alt kabuk başlatır, böylece ortamınızı bundan değiştiremezsiniz, ancak bu burada bir sorun gibi görünmüyor.


1
Ve bir ya da iki tane ortam değişkeni ayarlamanız gerekiyorsa, bunu en baştan başka bir komut olarak eklemeniz yeterli.
Hippo

1
@CraigMcQueen: pek değil. $?alt kabukta çalışan son komutun çıkış kodunu içerecektir. &&Varyantı kullanırsanız (genellikle kullanmanız gerekir), o zaman başarısız olan ilk komutun çıkış kodunu (veya hepsi yolunda giderse 0) alırsınız.
Mat,

Ben parantez isteğe bağlı olduğunu düşünüyorum
Francis.Beauchamp

10
@ Francis.Beauchamp: Eğer parenleri atlarsanız, başladığınız yer yerine komuttan sonra alt dizinde olacaksınız.
Mat,

Windows'ta bunu nasıl yapıyor?
Karl Morrison

22

Git komutunu bir yoldan yürütmenin ve depoda farklı bir yolla değişiklikler yapmanın bir yolunu arıyordum. Bu yüzden burada bu soruyu bitirdim.

Ancak benim özel ihtiyaçlarım için ne kabul edilen cevap ne de diğerlerinden hiçbiri yardımcı olmadı.

Git komutlarını kullanarak çalıştırmam gerekiyordu sudo -u USER /usr/bin/git(çalışan başka bir kullanıcı). Bildiğiniz gibi, sudo beni çalışmasına izin vermez cdkomutu, bu yüzden olamaz olmak depo dizininde.

Bu yüzden git'in erkek sayfasına gittim . Ve seçenekler arasında şunu gördüm --git-dir=<path>:

--git-dir =

Depoya giden yolu ayarlayın. Bu, GIT_DIR ortam değişkenini ayarlayarak da kontrol edilebilir. Geçerli çalışma dizinine mutlak bir yol veya göreceli bir yol olabilir.

Yani, eğer birisine yardım ederse, hala bir yoldan git kullanabilir ve "sizden uzak" bir depoda değişiklikler yapabilirsiniz. Sadece kullan:

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

veya başka bir kullanıcı olarak çalıştırmak için aşağıdakileri yapın:

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

Ayrıca git-init'in man sayfasından :

$ GIT_DIR ortam değişkeni ayarlanmışsa, depo tabanı için ./.git yerine kullanılacak bir yol belirtir.

Bu nedenle, her zamanki .git klasörünün altındaki depoyu başlatmak istiyorsanız, bunu seçenekle birlikte belirtmeniz gerekir --git-dir. Örneğin:

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

Depoyu başlattıktan sonra /path/to/repo/.git, tüm diğer komutlar --work-tree=<path>git'in man sayfasında açıklandığı gibi seçeneğe sahip olmalıdır :

--work ağacı =

Çalışma ağacının yolunu ayarlayın. Geçerli çalışma dizinine göre mutlak bir yol veya yol olabilir. Bu, GIT_WORK_TREE ortam değişkenini ve core.worktree yapılandırma değişkenini ayarlayarak da kontrol edilebilir (daha ayrıntılı bir tartışma için git-config (1) 'deki core.worktree'ye bakın).

Dolayısıyla, git'i başka bir kullanıcı olarak çalıştırmak ve yeni bir veri havuzu başlatmak için doğru komut:

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

Eğer bir komut dosyası aracılığıyla etkileşimli değil sudo kullanıyorsanız, sadece yapabileceği sudo -iveya sudo suetkileşimli bir kök kabuğu almak için.
Bugster

Neden ( cd subdir && sudo -u USER /usr/bin/git init )işe yaramayacağını hayal edemiyorum .
Scott

Ya erişim iznim yoksa subdir?
dmmd

13

Tam olarak ne sorduğunuzu değil (altta deniz kabuğu ile gerçek cevaplarınız var) ama bakın pushdvepopd


Maven için cd && ile denedim ve işe yaramadı, ama popd ve popd işi mükemmel yapıyor. Teşekkürler
Radu Toader

6

Birkaç seçeneğin var. Komutları &&veya ile gruplandırabilirsiniz ;. Bunun gibi:

cd subdir && git init && cd ..

veya

cd subdir; git init; cd ..

Bunların arasındaki fark, ilk örnekte, komutlardan birinin başarısız olması durumunda, bunların geri kalanının yürütülmeyeceğidir. İkinci örnekte, ne olursa olsun tüm komutlar çalışacaktır.

Başka bir seçenek bir işlevi tanımlamak ve kullanmaktır, örneğin:

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

Sonra komutu çalıştırabilirsiniz:

cdinit subdir

Ve otomatik git initolarak bu dizinde olacak ve onun dışına taşınacak.

Bir grup diziniz varsa ve git initbunlara tek bir komutla erişmek istiyorsanız, bir işlevi kullanarak daha karmaşık bir çözüm de yapabilirsiniz .

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

Daha sonra bunu ile çalıştırabilirsiniz:

cdinit subdir1 subdir2 subdir3

Ve yapacak git inityılında subdir1, subdir2ve subdir3.


Teşekkürler. Farkındaydım &&ve ;daha zarif bir şey umuyordum. Bir senaryo yazmak gibi görünüyor benim en iyi seçenek.
Trevor Burnham

Düzeltme: Bu cevap iyi, ama Mat'ın cevabı benim özel ihtiyaçlarım için daha iyi.
Trevor Burnham

cdinitFonksiyonunuzun keyfi komutlar için genelleştirilebileceğini düşünüyor musunuz ? Sadece argümanları kullanmayı denedim, ama bu işe yaramadı.
Chetan Bhasin

(1) Newline eşdeğerdir ;, böylece üç satır işlevi eşdeğerdir cd $1; git init; cd ... (2) Eğer değişkenleri alıntı olmalıdır: "$1", "$@"ve "$arg". Yoksa kısaltabilirsiniz for arg in "$@"için for arg.
Scott

5

Durumunda git(en azından sürümü 2.7.0 olarak), yararlanabileceğiniz -Cbu verilen dizinde başlandı sanki git davranmak yapar seçeneği. Yani çözümünüz şöyle görünebilir:

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

Belgelerin alıntılanması:

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

Komutları &&, örn.

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

Her komutun çıkış koduna bağımlılık istemiyorsanız, kullanabilirsiniz; bunun yerine, yani:

cd subdir ; git init ; cd ../

1
Veya bununla ;öncekilerin dönüş koduna bağlı kalmazlar.
slhck

(1)  cd subdir && git init ; cd ..aslında en mantıklı gelebilir. Kullanıcı git initkomutu içinde subdirçalıştırmak istiyorsa, muhtemelen komutu geçerli dizinde çalıştırmak istemez; yani, (ilk) cdbaşarısız olursa çalıştırmak istemezler . (Bu mümkün olsa da o  cdbiz çünkü başarısız zaten içinde subdir, ama bu bir köşe dava.) ... (devamı)
Scott

(Devam)… Ancak, kullanıcı üç komut bloğunu bir birim olarak ele almak isterse cd, git initkomut başarısız olsa bile başlangıç ​​dizinine yedeklemek isteyebilir  . ( Ya da alt dizininde kalmak ve komut hatası teşhis etmek isteyebilirsiniz.) (2) içermesi gerekmez /sonra  ...
Scott

2

Komutun bir dosya adı veya dizin adı parametresi yoksa hedef dizininize atlamanız gerekir.

Ancak, hedef dizini ve komutu parametre olarak alan bir bash betiği yazabilirsiniz. Bunun için pushd ve popd'a bakabilirsiniz: http://ss64.com/bash/pushd.html

O küçük senaryoyu senin için yazardım ama burada bir Linux kutum yok :)


Mark Szymanski'nin cevabını gördüm. Bir komut için sadece ikinci bir parametre uygulayabilirsiniz (ve komutu yeniden adlandırın) ve istediğinize sahip olabilirsiniz.
wullxz

1

Programların farklı argümanlarla başa çıkma yolları vardır, bu yüzden birkaç tanesinde -folder = name seçeneğinin bir eşdeğeri olacaktır . Bu istisnanın ötesinde, standart, hatta MS DOS’ta bile

$ program subdir

Bazen ihtiyacın var

$ program subdir /

Program klasörü açacak, onunla aynı dosya ile çalışacak şekilde çalışacak ve bitince, orijinal standart dizininizde belirtilen kabuğuna kontrolü geri gönderecektir. Bu şekilde ele alınan programlar DO hata çıktılarının (çekirdek dökümleri gibi) kabuğunuzun geçerli dizinindeki bir dosyaya gitmesine neden olur ( subdir .)

Programda farklı bir yer belirtmek için komut anahtarları bulunmadığı sürece geçici bir çözüm yoktur. Bazı programcılar “dizin programı çağrıldı ” ve “rehber program çalışması yapmaları isteniyor ” arasında sanatsal lisans aldı .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.