Başka bir dizindeki komut dosyalarını çalıştırma


12

Sıklıkla, yürütmek istediğim komut dosyası şu andaki çalışma dizinimde değil ve gerçekten bırakmak istemiyorum.

Başka bir dizinden komut dosyaları (BASH, Perl vb.) Çalıştırmak iyi bir uygulama mı? Genellikle düzgün çalışması için ihtiyaç duydukları her şeyi bulurlar mı?

Öyleyse, "uzak" bir komut dosyasını çalıştırmanın en iyi yolu nedir? bu mu

. /path/to/script

veya

sh /path/to/script

ve sudobu gibi durumlarda nasıl kullanılır ? Örneğin, bu işe yaramaz:

sudo . /path/to/script

Unutmayın . /path/to/script kaynaklar senaryoyu! Sadece çalıştırmak istiyorsanız döneme ihtiyacınız yoktur.
gniourf_gniourf

Yanıtlar:


14

sh / path / to / script yeni bir kabuk oluşturur ve mevcut kabuğunuzdan bağımsız olarak komut dosyasını çalıştırır. source(.) Komutu geçerli kabuğunda senaryodaki bütün komutları arayacak. Komut dosyası exitörneğin çağrılırsa, geçerli kabuğu kaybedersiniz. Bu nedenle, komut dosyalarını sh ile ayrı bir kabukta çağırmak veya tam (/ ile başlayan) veya göreli yolu (./) kullanarak ikili dosyalar olarak çalıştırmak daha güvenlidir. İkili olarak çağrılırsa, belirtilen yorumlayıcı ile yürütülür (örneğin #! / Bin / bash).

Bir komut dosyasının ihtiyaç duyduğu dosyaları bulup bulamayacağını bilmek için, komut dosyasına ne yaptığını görmek dışında iyi bir yanıt yoktur. Bir seçenek olarak, geçerli klasörünüzden ayrılmadan her zaman bir alt işlemdeki komut dosyasının klasörüne gidebilirsiniz:

$(cd /wherever/ ; sh script.sh)

3
Bunu mu demek istediniz (cd /wherever/ ; sh script.sh)? Neden $önünde bir tane var?
G-Man,

7

Bunu kesinlikle yapabilirsiniz (diğerlerinin belirttiği ayarlamalar ile sudo sh /pathto/script.shveya ./script.sh). Ancak, dirs için endişe ve bana işe yaramaz ekstra yazarak kurtarmak için sistem geniş çalıştırmak için birkaç şeyden birini yapmak.

1) Symlink için /usr/bin

ln -s /home/username/Scripts/name.sh /usr/bin/name

(üst üste binen bir ad olmadığından emin olun, çünkü açıkça geçersiz kılabilirsiniz.) Bu da onları gerektiği gibi ayarlayabilmem için geliştirme klasörümde tutmamı sağlar.

2) Komut dizini yolunuza ekleyin (.bash_profile - veya kabuğunuzda bulunan herhangi bir.profile dosyasını kullanarak)

PATH=/path/to/scripts/:$PATH

3) Alias adlı Oluştur .bash_profile içinde ~/.bash_profilegibi add şey:

alias l="ls -l"

Anlayacağınız gibi, sözdizimi sadece takma addır, komut olarak hareket etmek istediğiniz basamaktır, komut. Bu yüzden terminalde herhangi bir yere "l" yazmak sonuç verir. ls -l Eğer sudo istiyorsanız, sadece alias sl="sudo ls -l"kendinize not etmek için l vs sl (yararsız bir örnek olarak).

Her iki durumda da, yazabilir sudo nameofscriptve yolunuza devam edebilirsiniz. ./ veya ile uğraşmanıza gerek yok. veya sh, vb. Yalnızca önce yürütülebilir olarak işaretleyin: D


Ben çok seçenek 2 tavsiye ediyorum.
Bernhard

Neden ?, en iyi uygulama veya sadece tat?
Sergio

4

Genellikle söylediğin gibi yaparım

sh /path/to/script

Ve kök / süper kullanıcı olarak çalıştırmak için

sudo sh /path/to/script

Geçerli dizininiz yalnızca komut dosyaları ile aynı klasörde olduğunuzu varsayarsa önemlidir. Çoğu komut dosyasının bunu yapmadığını varsayarım ve yukarıdaki gibi çalıştırmak için tasarruf edersiniz.


/ etc / sudoers dosyasında
secure_path

bu en basit yöntem gibi görünüyor. ayrıca, perl /path/to/scriptperl betikleri için (perl'den bahsettiği için).
scottlittle

3

Genellikle komut dosyalarımı /usr/local/binveya /usr/local/sbin/(komut dosyasının kök ayrıcalıklara ihtiyacı varsa) içinde saklarım, burada Dosya Sistemi Hiyerarşi Standardı'na (FHS) göre.

Tek yapmanız gereken bu iki dizinin sizin sitenize eklendiğinden emin olmaktır PATH. $HOME/.bashrcDosyanızı düzenleyip bu satırı ekleyerek bunu yapabilirsiniz:

export PATH=$PATH:/usr/local/sbin:/usr/local/bin

Bir komut dosyasını root olarak yürütebilmek sudoistiyorsanız, bu dizinleri secure_pathalanınızdaki değişkene eklemeniz gerekir /etc/sudoers.

Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

Bu dosyayı düzenlemek visudo, herhangi bir hata yapmamanızı sağlayan çalışır .


Yazım hatası: .bashrcBunun yerine demek istiyorsun .bachrc.
gniourf_gniourf

0

Kimsenin önermediği varsayılmazsa, linux'da böyle çalıştığından emin değilim. Ancak dizinleri geri gitmek için ././ kullanmak yerine. Tırnakları mutlak bir yol vermek için kullanabilir misiniz? Belki de aslında bunu düşünmek için bile bunu yapabilmeniz için tüm güce erişmenize izin vermez.


0

Sık sık çalıştırmanız gereken komut dosyalarınız varsa ve kaynakları bulmak için konumlarına bağlıysa, bunu sadece böyle bir takma adda komutları birleştirerek yapabilirsiniz.

alias run-script="cd /home/user/path/to/script/ && bash script.sh"

Bu şekilde çalışmasını sağlamak için başka hiçbir şeyi değiştirmeniz gerekmez.


0

Neden kimse bunu önerdi emin değilim, ama süper kolay! Birkaç kez Googled ve verdiğim bu tam cevabı bulamadım, bu yüzden paylaşacağımı sanıyordum. IMO, bu ama en iyi çözüm, aynı zamanda en kolay çözüm, benim için yine de, ancak diğerleri farklı şeyler hissedebilir ve yapabilir.

# Place this somewhere in your .bashrc/.bash_profile/etc and edit as you see fit

YOURCOMMAND () {
  cd /path/to/directory/containing/your/script/ && ./YOURSCRIPT
}

Önce komut dosyalarının bulunduğu dizini söyleyen 'cd' komutu. Sonra '&&' ile bir sonraki komutu çıkardıktan sonra bağlayabilirsiniz. Son olarak komut dosyanızı terminal içinde yürüteceğiniz gibi açın! BASH dosyanıza kaydedildi ve kurulumu 5 saniye sürüyor.

Umarım bu birisine yardımcı olmuştur.


-1

Eski bir soru, ama zamansız bir soru.

Sürekli gördüğüm çözüm bir $HOME/bindizine sahip olmak ve onu ilk sıraya koymak $PATH( ~/.bashrceğer zaten orada değilse, bazı sistemlerde varsayılan ~/binolarak ilk sırada $PATH). Yürütme için komut dosyalarını buraya bırakmak veya başka bir yerde komut dosyalarına / yürütülebilir dosyalara bağlantılar, sistemi veya diğer kullanıcıları etkilememesi gereken yol sorunlarıyla başa çıkmanın basit yoludur.

Bir komut dosyası , kendi konumuna göre (nadir değil) bulunabilecek ek kaynaklar gerektiriyorsa , envvar $BASH_SOURCEkullanılır. $BASH_SOURCEdeğeri ne olursa olsun, o anda çalışan betiğin kendisine giden mutlak yolu içerir $PWD.

Aşağıdakileri göz önünde bulundur:

ceverett@burrito:~$ echo $PATH
/home/ceverett/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Bunun $HOME/binilk önce olduğunu görebiliyoruz $PATH, böylece ne koyarsam ~/binkoşacak. Adlı bir gösteri komut dosyası var ~/bin/findme:

#!/bin/bash

echo "Running from $BASH_SOURCE"

Bu, çalışan komut dosyasının konumuna giden mutlak yolu elde etmek için kullanılabilir.

ceverett@burrito:~$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~$ cd foo
ceverett@burrito:~/foo$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~/foo$ cd /
ceverett@burrito:/$ findme
Running from /home/ceverett/bin/findme

(1) Bu yararlı bilgi gibi görünse de, soru kaynakları kendi konumlarına göre kullanan komut dosyalarının nasıl yazılacağını sormadı ; komut dosyalarını çalıştırma hakkında sordu. (2) İkinci paragrafınızın soruyu nasıl ele aldığından emin değilim. Bir senaryo yazarsam ve Desmond'u çalıştırmak istiyorsa, onu özel bindizinine bağlaması gerektiğini mi önerirsiniz? Bu hantal görünüyor. (3) Ayrıca, konum bağımsızlığını bozar. Eğer /home/desmond/bin/foosenaryom bir bağlantıdır, o zaman BASH_SOURCEolacak /home/desmond/bin/foove komut dosyası kaynaklarını bulmak mümkün olmayacaktır.
G-Man

@ G-Man (1) Kullanıcı fazla bağlam sağlamadı. Ne zaman bu soru bana son 30 yılda sorulduğunda, önemsiz görevleri otomatikleştirmek için kendi ve diğer edinilmiş senaryolarının bir karışımını çalıştıran bir kullanıcı (genellikle yeni bir sysop veya geliştirici) her zaman bağlamda olmuştur, bu yüzden yol. Bu does kullanıcı soran adına kodlama bilgisi biraz varsayalım. (2) Sistem genelindeki komut dosyaları genellikle içine /binveya içinde bilinen bir konuma yüklenir /opt. (3) Konum bağımsızlığı, birbirine bağımlı bir kişisel betik koleksiyonu yazarken tam olarak bunu korur.
zxq9
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.