Bash betiği satır satır nasıl çalıştırılır?


Yanıtlar:


130

Her satıra bir okuma koymanıza gerek yok, bash betiğinize aşağıdaki gibi bir tuzak ekleyin, istediğiniz etkiye sahiptir, örn.

#!/usr/bin/env bash
set -x
trap read debug

< YOUR CODE HERE >

Çalışıyor, sadece bash v4.2.8 ve v3.2.25 ile test edildi.


GELİŞMİŞ VERSİYON

Komut dosyanız dosyalardan içerik okuyorsa, yukarıda listelenen çalışmayacaktır. Bir geçici çözüm aşağıdaki örnekteki gibi görünebilir.

#!/usr/bin/env bash
echo "Press CTRL+C to proceed."
trap "pkill -f 'sleep 1h'" INT
trap "set +x ; sleep 1h ; set -x" DEBUG

< YOUR CODE HERE >

Komut dosyasını durdurmak için bu durumda onu başka bir kabuktan öldürmeniz gerekir .


ALTERNATİF1

Betiğinizdeki sonraki komuta geçmeden önce birkaç saniye beklemek isterseniz, aşağıdaki örnek sizin için işe yarayabilir.

#!/usr/bin/env bash
trap "set +x; sleep 5; set -x" DEBUG

< YOUR CODE HERE >

Çıkışı daha okunaklı hale getirmek için trap komutuna set + x ve set -x ekliyorum.


2
O halde sonraki satıra nasıl geçersiniz (sonraki komutu çalıştırın)?
David Doria

2
Her komutta bir okumayı yakalar. Yapmanız gereken tek şey, bir sonraki komuta geçmek için geri tuşuna basmak
organik-mashup

1
bunun gibi komut satırlarınız varsa "satır okurken; echo $ satır; yapıldı <bir dosya" bu yöntem çalışmıyor çünkü "trap DEBUG oku" bir
dosyadan

3
Nasıl durdurursun? Komut dosyasının sonuna kadar adım attıktan sonra, kabuk komut dosyası hala çalışıyormuş gibi davranıyor.
slashdottir

1
trap 'read -u1' debugDosya okuma yeniden yönlendirme sorununu geçersiz kılmak için olarak değiştirin .
user3132194

23

Belki de BASH Hata Ayıklayıcısı sizin için bir şeydir.


3
Bu gerçekten en iyi çözüm. Çizgiyi çalıştırmadan önce (ve çok daha fazlasını) görüntülemeye izin verir. Çoğu sistemde birlikte kurulabilir apt-get install bashdb. O zaman sadece koşmanız bashdb your_command.sh, yazmanız stepve bundan sonra carriage return tuşuna basmanız gerekir.
studgeek

1
@studgeek Redhat / CentOS vb. üzerinde mevcut değil, bu yüzden buna "çoğu sistem" demem.
Sajuuk

@Sajuuk, paketlenmemiş olabilir , ancak kesinlikle mevcuttur .
Charles Duffy

macOS:brew install bashdb
boweeb

@CharlesDuffy: Varsayılan Ubuntu depolarında da değil.
Dan Dascalescu

3

Eğer bash betiğiniz gerçekten birer birer çalıştırmak istediğiniz bir grup komutsa, bunun gibi bir şey yapabilirsiniz, bu, bir değişkeni artırdığınızda her komutu tek tek LNçalıştırır ve çalıştırmak istediğiniz satır numarasına karşılık gelir. . Bu, son komutu tekrar çok kolay çalıştırmanıza olanak tanır ve ardından bir sonraki komuta gitmek için değişkeni artırmanız yeterlidir.

Komutlarınızın "it.sh" dosyasında olduğunu varsayarak, aşağıdakileri birer birer çalıştırın.

$ cat it.sh
echo "hi there"
date
ls -la /etc/passwd

$ $(LN=1 && cat it.sh | head -n$LN | tail -n1)
"hi there"

$ $(LN=2 && cat it.sh | head -n$LN | tail -n1)
Wed Feb 28 10:58:52 AST 2018

$ $(LN=3 && cat it.sh | head -n$LN | tail -n1)
-rw-r--r-- 1 root wheel 6774 Oct 2 21:29 /etc/passwd


1

xargs: satırları filtreleyebilir

cat .bashrc | xargs -0 -l -d \\n bash
  • -0 Ham girdi olarak davran (kaçış yok)
  • -l Her satırı ayırın (Performanslar için varsayılan olarak değil)
  • -d \\ n Satır ayırıcı
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.