Geçerli çalışma dizinini değiştirmek için bir komut dosyası çalıştırmak istiyorum:
#!/bin/bash
cd web/www/project
Ancak, çalıştırdıktan sonra, mevcut pwd değişmeden kalır! Bunu nasıl yapabilirim?
Geçerli çalışma dizinini değiştirmek için bir komut dosyası çalıştırmak istiyorum:
#!/bin/bash
cd web/www/project
Ancak, çalıştırdıktan sonra, mevcut pwd değişmeden kalır! Bunu nasıl yapabilirim?
Yanıtlar:
Beklenen bir davranış ve zaten birkaç kez tartışıldı.
Komut alt kabukta çalıştırılır ve üst kabuk çalışma dizinini değiştiremez. Tamamlandığında etkileri kaybolur.
Değişim dizinine kalıcı olmalıdır kaynak olduğu gibi, komut
. ./script
source ./script
aynı?
.
ve source
bash eşittir. 2. ./
Aynı dizinde ise dosya adından önce kullanmamız gerekmez . Sadece bu çalıştırmak için sorun yok:. script
Bunun gibi küçük işler için, komut dosyası oluşturmak yerine, bunun gibi bir diğer ad oluşturun,
$ alias cdproj='cd /dir/web/www/proj'
.bashrc
Her etkileşimli kabuk için ayarlanmasını istiyorsanız, bunu dosyanıza eklemelisiniz .
Şimdi bunu çalıştırabilirsin $ cdproj
.
eval `./script`
veya tuşunu kullanmasını da sağlayabilirsiniz eval $(./script)
. Bu, çağrılan kabuğun ortamını güncellemesi gereken komutlar için yaygın bir yaklaşımdır.
eval
Yaklaşmaya gidecekseniz ne çıktıya dikkat edin .
exec bash
Sonunda kullanınBir bash betiği şu anki ortamında veya çocuklarının üzerinde çalışır, ancak hiçbir zaman ana ortamında çalışmaz.
Ancak, bu soruya genellikle bir bash betiğinin başka bir dizinden çalıştırılmasından sonra belli bir dizinde bash isteminde bırakılmak istendiği için sorulur .
Bu durumda, betiğin sonunda bir alt bash örneği yürütün:
#!/usr/bin/env bash
cd desired/directory
exec bash
Bu yeni bir alt kabuk yaratır. Tip exit
komut başlangıçta başlatıldı ilk kabuk dönmek için.
exec
tipik bir hainin son çare olarak kabul edilir .. :)
exit
(veya Ctrl + D) sonlandırmayı denerseniz , bunu 11 ila 21 kez yapmanız gerekir. (2) Yürütülebilir bir komut dosyası kullanmanın başka bir dezavantajı, etkileşimli kabuk oturumunuzda herhangi bir kabuk seçeneği (örneğin dotglob
veya globstar
) ayarlarsanız, onları kaybedeceksiniz, çünkü yeni bir kabuk başlatıyorsunuzdur.
İstediğiniz işlemi yapan cevaplar olsa da, bu amaç için daha standart bir yöntem sembolik bir bağlantı oluşturmaktır:
ln -s ~/web/www/project proj #use full path to dir!
Sonra cd
ismini kullanarak dizine gidebilirsiniz proj
:
cd proj
Bu yöntem daha esnektir çünkü kısa adı kullanarak dosyalara erişemezsiniz cd
:
ls proj/ #note the endslash!
vim proj/file.x
Ne yapacağınıza bağlı olarak, başka bir çözüm bir komut dosyası yerine bir işlev oluşturmak olabilir.
Örnek:
Bir dosyada bir işlev oluşturun diyelim /home/aidin/my-cd-script
:
function my-cd() {
cd /to/my/path
}
Sonra onu bashrc
veya zshrc
dosyanıza ekleyin :
# Somewhere in rc file
source /home/aidin/my-cd-script
Şimdi bir komut gibi kullanabilirsiniz:
$ my-cd
Neden "exec" kullanılmıyorsa tam olarak ne istersem onu yapar.
#!/bin/bash
cd someplace
exec bash
~/someplace
exit
(veya Ctrl + D) sonlandırmayı denerseniz , bunu 11 ila 21 kez yapmanız gerekir.
dotglob
veya globstar
) ayarlarsanız, onları kaybedeceksiniz, çünkü yeni bir kabuk başlatıyorsunuzdur. … (Devam ediyor)
Bunu bir işlev kullanarak veya && kullanarak yapabilirsiniz. Aşağıdaki örnekler Zabbix'i yükler ve içinde bir çizgi bulunan bir dosya oluşturur.
Ör:
#!/bin/bash
# Create Function:
installZabbix(){
cd /usr/src/zabbix-4.2.4;
./configure --enable-agent;
make install;
cd /usr/src/;
>file;
echo "Hi, this is a file." >>file;
}
# Call the function:
installZabbix
veya:
#!/bin/bash
cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
return
Bu şekilde yazılmış bir betikten kaçmak için kullanmanız gerektiğine dikkat edin ,exit
bunlar kabuk işlevlerine benzemezexit
ve betiği alan kabuktan çıkacaktır.