Linux kabuğundan geçerli olandan farklı bir çalışma dizinine sahip bir programı nasıl çalıştırabilirim?


352

Linux kabuğu kullanarak , geçerli çalışma dizininden farklı bir çalışma dizinine sahip bir programı nasıl başlatırım?

Örneğin , geçerli dizindehelloworld dosyayı oluşturan bir ikili dosya var . Bu dosya dizinin içindedir .hello-world.txt

/a

Şu anda dizindeyim /b. Programımı çalıştırmak ../a/helloworldve hello-world.txtüçüncü bir dizinde bir yere almak istiyorum /c.


5
suHerhangi bir -ckomutu çalıştırmadan önce çalışma dizinini belirttiğiniz kullanıcının ana dizinine sıfırlamanın zor yolunu keşfettim . Bu bana çok yardımcı oldu.
Patrick M

Yanıtlar:


561

Programı şöyle arayın:

(cd /c; /a/helloworld)

Parantezler bir alt kabuğun ortaya çıkmasına neden olur. Bu alt kabuğu sonra çalışma dizini değiştirir /csonra çalıştırır helloworldden /a. Program çıktıktan sonra, alt kabuk sonlandırılır ve sizi başlangıçtaki dizinde ana kabuk isteminize döndürür.

Hata işleme: Programı dizini değiştirmeden çalıştırmaktan kaçınmak için, örneğin yanlış yazarken /c, helloworldkoşullu yürütmeyi yapın :

(cd /c && /a/helloworld)

Bellek kullanımını azaltma: Merhaba dünya yürütülürken alt kabuk atık belleğine sahip olmaktan kaçınmak için helloworldexec ile arayın :

(cd /c && exec /a/helloworld)

[ Josh ve Juliano'ya bu yanıtı iyileştirme konusunda ipuçları verdikleri için teşekkürler !]


1
Bu kabuğa argüman iletmenin bir yolu var mı? 1 $ ve 2 $ gibi?
finiteloop

2
@segfault: Alt kabuk çevresindeki kapsama tam erişime sahiptir.
David Schmitt

Zaten geçici olarak bu dizinde görünüyor, değil mi?
dhein

1
Tüm argümanları $ *, $ @ veya "$ @" yaparak iletebilirsiniz (argümanların çift tırnaklara saygı duymasını istiyorsanız)
Marcel Valdez Orozco

1
Bu satırı /etc/rc.d/rc.local dosyasına eklersem çalışır mı?
Pratik Patil


25

Alt kabuk gerektirmeyen ve bash için yerleşik bir seçenek

(pushd SOME_PATH && run_stuff; popd)

Demo:

$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit

1
Benzer bir öneri aşağıda Sahil tarafından yapılmıştır. Komut başarısız olursa çalışmaz. Düşünün pushd SOME_PATH && run_stuff && popd- run_stuff başarısız olursa, popd yürütülmez.
Anton Daneyko

Geç cevap, bash dosyasının ayarlarına bağlıdır. Bash, başarısız bir komuttan sonra bile komutları yürütmeye devam edebilir (&& kullanmanın aksine), ancak bunu set -edosyada kullanarak yapamayacak şekilde ayarlanabilir ve sonra başarısız olur popd.
Loren

8
Yine de, pushd "${SOME_PATH}" && run_stuff; popdmevcut cevaptan daha iyi olduğunu düşünüyorum , çünkü pushd / popd anlambilimi, bir dizine girme ve sonra orijinaline geri dönme durumu için özel olarak tasarlandı.
Marcel Valdez Orozco

Takma ad olarak tanımlandığı gibi nasıl çalışır ve param geçirmem gerekir?
DrB

Ben bir takma adın ortasında bir parametre geçemez gibi komutlar serisi yürütmek parametre geçecek bir kabuk komut dosyası yazmak gerektiğini düşünüyorum. Bunu yazmak için yardıma ihtiyacınız varsa, ayrı bir soru sormalı ve buna başvurmalısınız. Kabuk betiğini aldıktan sonra, yeni betiğinizi çağırmak için bir takma ad yazabilirsiniz.
Loren

19
sh -c 'cd /c && ../a/helloworld'

1
FreeBSD'nin jexec'i için, belirtilen çalışma dizinindeki hapishane içinde bir komut yürütmek için bunu kullanın.
Marián Černý

11

Her zaman UNIX araçlarının filtre olarak yazılması, stdin'den girdiyi okuması ve stdout'a çıktı yazması gerektiğini düşünüyorum. Mümkünse, helloworld ikili dosyanızı, metin dosyasının içeriğini belirli bir dosya yerine stdout'a yazacak şekilde değiştirebilirsiniz. Bu şekilde, kabuğunuzu kullanarak dosyanızı istediğiniz yere yazabilirsiniz.

$ cd ~ / b

$ ~ / a / helloworld> ~ / c / helloworld.txt


6
Doğru olmak için +1, ancak cevap sadece çevresel olarak bir cevaptır.
David Schmitt

8

Son "&&" yi ";" ve komut başarısız olursa veya başarılı olursa olsun cd geri döner:

cd SOME_PATH && run_some_command ; cd -

4

Bunu yapmanın bir yolu, bir sarıcı kabuk betiği oluşturmaktır.

Kabuk betiği geçerli dizini / c olarak değiştirir, ardından / a / helloworld komutunu çalıştırır. Kabuk betiği çıktıktan sonra, geçerli dizin / b'ye geri döner.

İşte bir bash kabuk komut dosyası örneği:

#!/bin/bash
cd /c
/a/helloworld

2

neden basit tutmuyorsun

cd SOME_PATH && run_some_command && cd -

son 'cd' komutu sizi son pwd dizinine geri götürür. Bu tüm * nix sistemlerinde çalışmalıdır.


@Mezhaka yazıyorsunuz, bunu düşünmeliydiniz :)
Sahil

1
Uyarı: run_some_commandBaşarısız olursa, cd -yürütülmez.
starbeamrainbowlabs

1

Her zaman / C'ye gitmesini istiyorsanız, dosyayı yazarken mutlak bir yol kullanın.


0

Bunu programınızın içinde gerçekleştirmek istiyorsanız, şöyle bir şey yaparım:

#include <unistd.h>
int main()
{
  if(chdir("/c") < 0 )  
  {
     printf("Failed\n");
     return -1 ;
  }

  // rest of your program...

}

Bunu bir kabuk komut dosyasında değil, C dilinde yapmak istiyor. Ayrıca, ikili dosyayı alt işlemek korkunç bir fikir olurdu.

-1

geçerli dizinden komut yürütmek için komut dosyası dizininin tam yolunu sağlar

/root/server/user/home/bin/script.sh

1
Bu çalışma dizinini hiç değiştirmez - sanırım sorulan soruya farklı bir soruya cevap veriyorsunuz.
Toby Speight

Yanıtladığınız soruya bir cevap bulmak için buraya geldiniz. Teşekkürler! lol
kfrncs
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.