Komut dosyasını mevcut kabukta olmadan çalıştırın. komuttan önce


26

Bir komut dosyası mevcut kabukta çalıştırılacaksa, komuttan önce nokta ekleyerek elde edilebilir:

   . ./somescript.sh

Her seferinde noktayı yazmadan bunu yapmanın bir yolu var mı? Örneğin betiğin kendisinden üst kabuk değiştirmeye yönelik bir komut mu?

Yanıtlar:


22

Tam olarak istediğin olmayabilir, ama yapabilirsin:

alias somescript.sh='. ./somescript.sh'

2
Bu benim sorunumu mükemmel çözdü. Teşekkür ederim!
alu

8

Her seferinde noktayı yazmadan bunu yapmanın bir yolu var mı? Örneğin betiğin kendisinden üst kabuk değiştirmeye yönelik bir komut mu?

Var olduğunu sanmıyorum (yazmanın dışında source somescript.sh, ama muhtemelen aradığın şey bu değil ^^).

Komut dosyasını her zamanki gibi çalıştırırsanız, ./somescript.shkabuk bu komutu kullanır ve yürütür. Komutu çekirdeğe iletir ve ardından çekirdek, komutun #!içindeki satırı ayrıştırıp bu komutun nasıl yürütüleceğine karar verir . Daha sonra çekirdek belirtilen tercümanı başlatır (bu durumda muhtemelen bir bashalt kabuk). Bunun somescript.shiçin çevrede yapılan değişiklikler alt kabukta ana kabuğu etkilemeden izole edilir.

Kabuğun başka bir işlemi başlatmadan komut dosyasının kendisini okumasını istiyorsanız, açıkça .veya sourceanahtar sözcüğünü kullanarak söylemeniz gerekir .


Detaylı açıklama için teşekkürler. :) Şimdi, betiğin kodundan bunu yapmanın bir yolu olmadığını görüyorum, ancak neyse ki ana kabuğa scott'un aliasönerdiği gibi komutla bir alt kabuk oluşturmaması söylenebilir .
alu

1

Yürütürseniz ./somescript.shharici bir program olarak, böyle bu çevrede bir yolu yoktur, vb geçerli dizin değişen değişkenlerini ayarlama, sigara ihraç değişkenleri erişme gibi, çalışan kabuk süreci içine bir şey yapamaz.

(Peki, tamam, alt işlemden bir hata ayıklayıcı çalıştırabilir ve ana işlemin belleğini çimdikleyebilirsiniz. Ancak denerseniz, en olası sonuç ana kabuğun çökmesidir.)

Koşman gerek . ./somescript.sh. İsterseniz bir takma adın veya işlevin arkasına gizleyebilirsiniz, ancak yine takma adın veya işlev tanımının üst kabukta yapılması gerekir.


0

Sanırım çalıştırmaya çalıştığınız komut dosyası çalıştırılabilir değil. chmod a+x somescript.shBu dosyaya kullanıcı, grup ve diğer (ugo) için yürütme bitini ekleyecektir. Dosyanın ilk satırında ayrıca #! üstündeki çizgi, gibi #!/bin/bash.

ls -l somescript.shDosya için rwx üçlüsünü (okuma / yazma / yürütme) gösterir. Dosyanın size ait olduğunu varsayarak en azından ilk sette bir x'e ihtiyaç duyacak.


Komut dosyalarının kendisi iyi çalışıyor, ancak kabuğun ortam değişkenlerini değiştirebilmek için geçerli kabukta yürütmek istiyorum.
alu

Komut dosyasında istediğiniz değişkeni dışa aktarmak işe yaramazsa export PATH=$PATH:/usr/local/bin, $ PATH'inize / usr / local / bin öğesini eklemek istiyorsanız, çalışan ortam değişkenlerinizi değiştirmek için dosyayı kaynaklamanız gerekir. Bu soru gerçekten "Çalışan kabuktaki ortam değişkenlerimi bir bash betiğinden programlı olarak nasıl değiştiririm?" Betik . ./somescript.shgayet iyi çalışıyor - bir dosyaya kaynak sağlamak için dot komutunu kullanıyorsunuz. tcsh aynı şey için "kaynak" kullanır.
AR Diederich

Bir değişkeni değiştirmek sadece bir örnekti. Benim sorum kabuğa gerçekte yazmadan bir nokta olması gerektiğini söylemek mümkün olup olmadığıdır (örneğin betiğin kendisinden)
alu

Komut dosyasının davranışını tamamen değiştirebilen nokta kolayca unutulabilir.
alu

0
export PATH=$PATH:.

Bu komutu kabukta çalıştırmak veya kabuk yapılandırma dosyanıza eklemek, geçerli dizini PATH değişkenine ekler. PATH değişkeni, bir komut verdiğinizde kabuğunuzun çalıştırılacak ikili dosyaları arayacağı dizinlerin listesidir.

Bu, geçerli dizinde herhangi bir yürütülebilir dosyayı çalıştırmanıza izin vermez. ./


1
OP ilk önce dosya adının bir parçası .olmadığını soruyor ./. ./Somescript'i çalıştırmak, geçerli kabuğunda olduğu . ./somescriptgibi çalıştırmaz.
Anthon
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.