Etkileşimli olarak kullanılması amaçlanan işlevlerde kullanım yorumlarını görüntüleme


11

.bashrcBir terminalde etkileşimli olarak kullanılmak üzere tasarlanmış , benim tanımlanmış bir dizi işlevi var . Genellikle onlardan önce amaçlanan kullanımını açıklayan bir yorumla karşılaştım:

# Usage: foo [bar]
# Foo's a bar into a baz
foo() {
  ...
}

Kaynak koduna göz atarsanız bu iyi olur, ancak typeişlevin ne yaptığını hızlı bir şekilde hatırlatmak için terminalde çalışmak güzeldir . Ancak bu (anlaşılır şekilde) yorumları içermez:

$ type foo
foo is a function
foo ()
{
    ...
}

Hangi beni "bu tür yorumların typegörüntülenmesi için devam ederse iyi olmaz mıydı ?" Diye düşündürdü. Ve Python'un öğretileri ruhu ile bunu buldum:

foo() {
  : Usage: foo [bar]
  : "Foo's a bar into a baz"
  ...
}

$ type foo
foo is a function
foo ()
{
    : Usage: foo [bar];
    : "Foo's a bar into a baz";
    ...
}

Şimdi kullanım typeçıktıya dahil ! Tabii ki gördüğünüz gibi alıntı hata eğilimli olabilir bir sorun haline gelir, ancak çalışırken daha hoş bir kullanıcı deneyimi.

Benim sorum şu, bu korkunç bir fikir mi? Bash işlevlerinin kullanıcılarına ek bağlam sağlamak için daha iyi alternatifler var mı (a man/ infofor işlevleri gibi)?

İdeal olarak hala kullanım kodunun fonksiyon tanımının yakınında bulunmasını isterim, böylece kaynak kodunu görüntüleyenlerin de faydası olur, ancak bunu yapmak için "uygun" bir yol varsa alternatiflere açıkım.

Düzenleme bunların hepsi oldukça basit bir yardımcı tarzı fonksiyonlar ve sadece etkileşimli biraz fazladan bağlam almak için arıyorum. Kesinlikle bayrakları ayrıştıran daha karmaşık komut dosyaları için bir --helpseçenek eklerdim, ancak bunlar için her şeye yardım bayrakları eklemek biraz külfetli olurdu. Belki de bu sadece kabul etmem gereken bir maliyet, ama bu :kesmek kaynağı düzenlememizi okumak için çok daha zor hale getirmeden makul derecede iyi çalışıyor gibi görünüyor.

Yanıtlar:


8

Bunu yapmanın iyi bir yolu olduğunu düşünmüyorum.

Birçok işlev, komut dosyası ve diğer yürütülebilir dosyalar, kullanıcı sağladığında -hveya --helpbir seçenek olarak bir yardım iletisi sağlar :

$ foo() {
[[ "$1" =~ (-h|--help) ]] && { cat <<EOF
Usage: foo [bar]
Foo's a bar into a baz
EOF
return;
}
: ...other stuff...
}

Örneğin:

$ foo -h
Usage: foo [bar]
Foo's a bar into a baz

$ foo --help
Usage: foo [bar]
Foo's a bar into a baz

Evet, bundan bahsetmeliydim. Bunlar basit işlevler ve onları aşırı karmaşık hale getirmekten kaçınmaya çalışıyorum. Bayrakları ayrıştırmayı hak eden komutlar için kesinlikle bir --helpseçenek eklerdim.
dimo414

Programlamada tutarlılık bir erdemdir. Ayrıca, "karmaşık" ile ne demek istediğinize bağlıdır.
John1024

Ve yaklaşımınız zekice ve iyi (ve sorunuz zaten + 1'ime sahip).
John1024

1
Teşekkürler; uygulamanız --helpda invaziv değildir, bence bu durumda birincil kriterlerimdir. Sonunda :kullanım durumuma daha uygun olduğu için hile kullanabilirim, ancak desteklemenin zor olmadığını --helpve çoğu kullanıcının bunu bekleyeceğini belirttiğiniz için teşekkür ederim .
dimo414

1
+1. i "getopts kullanın" cevap olacaktı ama başka seçenek yoksa bu yeterince iyi çalışıyor. işlevin başka seçenekleri varsa kullanın getopts.
cas

0

Ben hiç oldukça dalma ve kullanım almaya kendimi ikna :pseduo-yorum olarak komutları. Özellikle, her zaman "yorumların" aslında değerlendirilen ve potansiyel olarak yan etkileri olabilecek (ya da sadece bir hatalı gibi bir şeyleri kırabilecek) argümanlar olduğu konusunda endişeliyim '. Fikrin sadeliğini hala seviyorum, ancak ödünleşmeyi hiçbir zaman haklı bulmadım.

Bir --helpbayrak veya benzeri bir şeyle kullanım metni sağlama konusundaki tereddütüm her zaman onunla birlikte gelen en önemli unsur olmuştur. Bayrakları kabul etmeye başlar başlamaz, genellikle (Bash'te) oldukça fazla kaynatma plakası gerektiren tam teşekküllü argüman ayrıştırma işlemine hızla girersiniz .

Kısmen, bu köprü için bir araya çekilmiş bir küçük yardımcı sargıları bu getoptsiçin bu klişe azaltmak için. Hala birkaç satır alıyor, bu yüzden başka küçük işlevlerde kullanmam, ancak getoptsdoğrudan kullanmaktan çok daha özlü . Aşağıda, işaretli bir örnek kullanım verilmiştir -h( getoptsyalnızca tek harfli seçenekleri destekler):

foo() {
  local _usage='foo [-a] [-b] [-f val] [-v val] [args ...]'
  eval "$(parse_opts 'f:v:abh')"
  if (( h )); then
    echo "Usage: $_usage"
    return 0
  fi
  echo "f=$f v=$v a=$a b=$b -- $#: $*"
}
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.