Unix komutlarını komut satırında belgeleme


7

Son komutun ve son komutun çıktısını bir öğretici amaç için bir metin dosyasına eklemek istiyorum.

Örneğin: Bir lsgiriş dizinini yaptıktan sonra bunu ekranda görüyorum

bguiz@sheen:~$ ls
Desktop     Music    Documents

Daha sonra, aşağıdakileri bir textfile dosyasına ekleyecek tek bir komut girebilmek istiyorum. cmd.txt

$ ls
Desktop     Music    Documents

Fikir, bir komuta her girdiğimde hem komutun hem de çıktısını aynı dosyaya kaydedebildiğim ve birkaç komuttan sonra belirli bir komut dizisini göstereceğidir. Bunun elle yapılabileceğini biliyorum - ama eğer kolay bir alternatif varsa, neden öyle yapmalı?

Şimdiye kadar pişirdiğim şey bu:

echo -n "\$ " >> cmd.txt; echo !-1:p >> cmd.txt; !-1 >> cmd.txt

Çalışır, ancak oldukça tıknazdır ve tam ekran biçimlendirmesini koruyamamak gibi çeşitli özelliklere sahiptir.

Daha zarif bir çözüm mü?


Şimdiye kadarki cevaplar için teşekkür ederim, ama bununla birlikte boru ile çalışması gerektiğine dair bir isteğim var, örneğin:

ls -lart | grep ^d

Dosyaya eklenmiş olması gerekir:

$ ls -lart | grep ^d
drwx------ 14 bguiz staff   4096 2010-03-03 15:52 .cache
drwx------  5 bguiz staff   4096 2010-03-03 09:38 .ssh

Yanıtlar:


3

[script.ksh] "script.ksh ls" ile çalıştırın

#!/bin/ksh

OUTPUT="cmd.txt"

if [[ $# -eq 0 ]];then
  print "no command to run"
  exit
fi

# dump command being run to file
echo $@ >> $OUTPUT

# run command and output stdout to the screen and file
$@ | tee -a $OUTPUT

@Duane, cevap için teşekkürler. Ben yerine denedim $1ile $@ve bu dahil boruların kadar çalıştı. Ne demek istediğimi görmek için ana sorumun düzenine bakın.
bguiz

Buna biraz baktım ama biraz güdük ... sorun şu ki | kabuk için önemlidir ve asla komut dosyasına geçilmez. Senaryoda yapılan modifikasyonlar ile, boruyu (\ |) kaçmaktan kurtulabilirsiniz ama bunun bir no-go olduğunu varsayıyorum.
Duane

10

Denediğin zekâdan çok daha basit:

$ script cmd.txt

burada belgelemek istediğiniz şeyi yapın

sonra Control-d'ye basın.

İsterseniz ek açıklama eklemek için dosyayı daha sonraki bir tarihte düzenleyebilir ve kullanabilirsiniz.

$ script -a cmd.txt

Varolan bir dosyaya daha fazla metin eklemek için

Mevcut seçenekler, uygulama arasında oldukça farklı görünüyor.

  • Mac OS X (yani BSD) betiği, -kklavye girişini komuta kaydedenleri destekler
  • GNU sürümü (linux sistemlerinde bulunur) -c, orijinal komut satırında komutu belirtmenize izin verir, "gösterinizi buraya yazıp control-d ismine bas" bitini atlamanızı sağlar
  • BSD versiyonu olabilir ayrıca komut satırında komutu belirtmek, ancak (bu durumda gereklidir) o bunun yerine çıkış dosya adı uymalı için bir bayrak kabul etmez.

Sonunda GNU versiyonu, viyazı betiklerinde iyi temsil edilmediği konusunda uyarıyor (ve bu uyarının, küfürlerden yararlanan diğer tüm komutlara eşit derecede iyi uygulandığını düşünüyorum).


@dmckee, bu harika, ancak daha ayrıntılı bir denetim istiyorum, kaydetmek istediğim her komutu takiben bir komut girdim (hepsi değil). Ayrıca echo "Something" >> cmd.txt"açıklamalar için de komutlar arasında girebilmem gerekiyor .
bguiz

script -a -c "some command"ardından tüm komutları temizlemek için bazı komutlar geldi Script started...ve Script done...çizgiler benim için işe yarayacak gibi görünüyor.
bguiz

@bguiz Temizleme komut dosyasını şu şekilde yapabilirsiniz: ilk önce bir işaretçiyi ekolayan yeni bir komut yaparsınız. Daha sonra bir komutun kaydedilmesini istediğinizde bu komutu çalıştırın. Temizleme yaparken, hangi komutları kaydetmek istediğinizi belirlemek için bu işaretçiyi kullanabilirsiniz. Açıklamaya gelince, benzer şekilde yeni bir komut yapabilirsiniz. Sadece yorum ile bir işaretçi yankı olabilir.
Egon

4

script.shAşağıdakine benzer bir komut dosyası yazın ; yorum biçiminde açıklama eklediniz mi:

#!/bin/sh -v

# Annotating the behaviour of the ls command
ls -l

# Other comments on the next command
cmd

Not -vilk satırda anahtarı:

-v verbose       The shell writes its input to standard error as it is read.

Ardından stdout ve stderr komutunu cmd.txtkullanarak dosyaya yönlendiren komut dosyasını yürütün :

$ ./script.sh > cmd.txt 2>&1

Dosya cmd.txtek açıklamaları, komutları ve bunların göreceli çıktısını içerecektir:

# Annotating the behaviour of the ls command
ls -l
total 1824
drwxr-xr-x 11 mrucci mrucci    4096 2010-02-14 18:16 apps
drwxr-xr-x  2 mrucci mrucci    4096 2010-02-20 12:54 bin
-rw-------  1 mrucci mrucci  117469 2010-02-25 11:02 todo.txt

# Other comments on the next command
cmd
./testscript.sh: 7: cmd: not foun

Not: Komut dosyasına yürütme izni vermeyi unutmayın:

$ chmod +x script.sh

1

Bu koşullarda, genellikle iki teknikten birini kullanıyorum:

sh -x script

Veya sadece komutları çalıştırın ve ardından materyali bir dosyaya kaydetmek için copy'n'paste kullanın.

'Sh -x' çıkışı normal PS1 istemini içermez - varsayılan olarak '+', IIRC olan PS3'ü kullanır. Ve çıktıyı hafifçe değiştirir - ayrıntılar, kullandığınız kabuğa bağlı olarak biraz değişir (bu nedenle, 'bash', 'ksh' veya Bourne kabuğundan daha fazla karışıklık yapar). Nadiren copy'n'paste'in yönetebildiğinden daha fazla materyale ihtiyacım var, bu yüzden StackOverflow ve SuperUser için baskın modus operandi.


Mac OS 10.5'im veya Debian Lenny kutularım gibi değil -x. :: sigh :: Man sayfaları, script için herhangi bir standarda atıfta bulunmaz. Unix savaşlarının son yargısı sanırım.
dmckee

MacOS X 10.5'te (veya 10.4, ... veya şu anda 10.6.2'de) 'sh -x' ile hiçbir zaman sorun yaşamadım. Hangi kabuğu kullanıyorsun? 'sh -x' kabukların çoğunda yaygındır - itiraf etmeliyim ki, onu desteklemeyen hiçbirinin farkında değildim.
Jonathan Leffler

@dmckee: 'sh -x' yazdığınızda, kabuk komut dosyası için yol tabanlı bir arama yapmaz - yolu tamamen belirtmeniz gerekir.
Jonathan Leffler

Afedersiniz. Tamamen yanlış anlaşıldım. SOFU'yu yatmadan hemen önce kontrol ettiğim şey bu.
dmckee
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.