Kabuk genişlemesini yazdırmak mümkün mü?


18

Kabuk kullanıcının yazdığı komutları genişletmek belirli bir kurallar kümesi olduğunu biliyorum. (bash kabuğundan bahsedelim.)

Kabuk genişletmeden sonra formda bir komut yazdırmak mümkün mü? Kabuğun özel karakterleri nasıl genişlettiğini öğrenmek ve öğrenmek için iyi bir yardımcı program gibi görünüyor.

Örneğin

$ echo *

{all the filenames in current dir}

Aşağıdaki satır olan genişletilmiş komutu yazdırmak istiyorum:

echo {all the filenames in .}

Yanıtlar:


13

Sadece kullanın echo... genişletmek istediğiniz komutun önüne koyun. Bunu oldukça sık kullanıyorum.

$ ls
one.txt
two.txt
three.dat
$ echo rm *.txt
rm one.txt two.txt
$ rm *.txt

Sen kullanabilirsiniz Homeve Delhızlı bir şekilde önceki ekleme / kaldırma için echo.

DÜZENLEME Yorumlarda belirtildiği
gibi , komut yalnızca basit bir komut değilse (bu bir döngü ise, boruyu kullanırsa veya bunun gibi bir şeyse) bu işe yaramaz .for|&&


1
Bir senaryoyu test ederken yaptığım bu
Barmar

Bu hala diğer kabuk belirteçlerinden etkilenir echo cat * | someprogramve bu yanıttan ne düşündüğünüzü yapmaz.
Kroltan

13

Kullanabilirsiniz set -x.

Örneğin, komut dosyasını düşünün:

$ cat script.sh
set -x
echo *

Çalıştırıldığında, echogerçekten çalıştırmadan önce genişletilmiş ifadeyi gösterir :

$ bash script.sh
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh

Ve Kundor'un belirttiği gibi, bu komut satırında da etkileşimli olarak çalışır :

$ set -x
+ set -x
$ echo *
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh

belgeleme

man bashne yaptığını şöyle açıklar set -x:

Her basit komutu genişlettikten sonra, komut, büyük / küçük harf komutu, select komutu veya komut için aritmetik için, PS4'ün genişletilmiş değerini, ardından komutu ve genişletilmiş bağımsız değişkenlerini veya ilişkili sözcük listesini görüntüleyin.

İçin varsayılan değer PS4, yukarıda gösterildiği gibi, artı işareti ve ardından boşluktur.


2
Ve interaktif bir kabukta da iyi çalışıyor (ki OP'nin aradığını düşünüyorum.)
Nick Matteo

7

Etkileşimli bir kabuk için, Ctrl+xardından *glob kalıbını yazdıktan sonra tuşuna basmak komut satırınızı bu glob kalıbı genişletilmiş şekilde düzenler. Bash man sayfasından:

glob-expand-word ( C-x *)

Noktadan önceki sözcük, yol adı genişletmesi için bir desen olarak ele alınır ve sözcüğü değiştirerek eşleşen dosya adları listesi eklenir. Sayısal bir bağımsız değişken sağlanırsa, yol adı genişletmesinden önce bir yıldız işareti eklenir.

Ayrıca ilginizi çekebilir glob-list-expansions ( Ctrl+x, g).


Mac OS'den bash kullanıyorum. Ctrl + x, komut + x'i denedim. Herhangi bir komut satırı düzenleme yapıp yapmadığından emin değilim. daha fazla ayrıntı verebilir misiniz?
Weishi Zeng

@WeishiZeng Neden senin için çalışmadığını bilmiyorum. Bastın mıCtrl+x, * hemen sonra echo *ve enter tuşuna basmadan önce bastınız mı? Hala çalışmıyorsa, ~/.inputrcglob-expand-word'ü başka bir şeye değiştirebilir ve bağlayabilirsiniz.
jamesdlin

contrl + x imleci echo sözcüğüne taşır, ancak hiçbir şeyi düzenlemez. "Ctrl + x " ne anlama geliyor ?? (ctrl + x VEYA ctrl + ??) * Shift'te, bu yüzden bir * almak için Shift'e de basmam gerekiyor, değil mi?
Weishi Zeng

Sağa basın Ctrl+x ardındanShift+8 . Çalışıp çalışmadığını görmeyi deneyebilir Ctrl+x, gveya daha önce söylediğim gibi .inputrcdosyaya kendi anahtarınızı atayabilirsiniz .
jamesdlin

1

Bağımsız değişkenlerin nasıl genişletildiğini veya belirlendiğini görmek istiyorsanız, bağımsız değişkenlerini yazdıran bir program veya komut dosyası kullanabilirsiniz. İşte bir uygulama bash:

#!/bin/bash

for (( i = 0; i <= $#; ++i )); do
    printf 'argv[%d] = %s\n' $i "${!i}"
done

Bunu adlı bir dosyaya koyduğunuzu printargs.sh(ve yürütülebilir hale getirdiğinizi) varsayarsak , bu şekilde çıktı alırsınız

$ ./printargs.sh a{1..3}b
argv[0] = ./printargs.sh
argv[1] = a1b
argv[2] = a2b
argv[3] = a3b
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.