Bash geçmişi ikamesi neden varsayılan olarak hala etkindir? [kapalı]


17

Bash'ın neden varsayılan olarak tarih değiştirmenin hala etkin olduğunu bilen var mı ? Benim .bashrcdahilset +H uzun yıllardır etti ama bazı insanlar hala bu özellik tarafından ısırılıyor.

Hemen hemen herkesin, kopyala-yapıştır özelliklerine vereadline kütüphane ile derlenmiş bash'a sahip terminaller kullanması ve tarih değiştirme sadece interaktif kabuklarda varsayılan olarak etkinleştirildiği bu özelliğe sahip olmanın herhangi bir nedeni var mı? Tüm komut dosyaları için varsayılan olarak devre dışı bırakılsa bile varolan komut dosyalarının hiçbiri bozulmaz.

Geçmiş değişikliğinin neden bozuk olduğunu bilmiyorsanız bunu deneyin:

$ set +H # disable feature history substitution
$ echo "WTF???!?!!?"
WTF???!?!!?
$ set -H # enable feature history substitution
$ echo "WTF???!?!!?"
echo WTF???echo WTF???!?!!?
WTF???echo WTF???!?!!?

(Açıkçası, tüm komut dosyaları için varsayılan olarak devre dışı bırakılmışsa ve yürütmeden önce sonuçları doğrulamak için bir özellik varsa, önemli sorunlar vardır:. shopt -s histverify)

Ayrıca bakınız:


16
İnsanların tarih değişikliğini kullanmadığını düşünüyor gibisiniz. Her gün kullanırım. Ben daha hızlı takip etmek için bulmak ls -l foo/bar/baz/weeble.cppile less !$daha hatırlama komuta ve düzenlemek o.
Martin Bonner Monica'yı

2
@MartinBonner Böylece etkinleştirebilirsiniz. Soru, neden hala var olduğu değil, varsayılan olarak neden etkinleştirildiğiyle ilgili .
Barmar

5
@Barmar: Tabii. Ama asıl mesele, sorunun dayandığı varsayımına meydan okumaktı.
Martin Bonner Monica'yı

5
Gerekçenizi takip edersek, kaçmayı veya alıntı yapmayı gerektiren her şey varsayılan olarak devre dışı bırakılmalıdır. Neden içeren bir URL'den kaçmam veya teklif vermem gerekiyor &? Neden bir dosya adı içeren bir dosya adından kaçmalı ya da teklif vermeliyim ?? Bunun bir sorun olduğunu düşünen insanlar için arayüzler var.
jcaron

3
Kullandığım !$günde birkaç kez, ve !!oldukça sık de. İtiraf etmeliyim ki diğer tarih ikamelerini o kadar fazla kullanmıyorum, ama yıllardır kullandığım kabuğun varsayılan davranışı aniden değiştiğinde kesinlikle mutsuz olurum.
jcaron

Yanıtlar:


32

Zaten aşina iseniz, bashtarih değiştirme kalıplarıyla uğraşmak, sizi bu kabuğa özel olan diğer karakterleri ele almaktan daha fazla ısırmayacaktır. Bununla birlikte, bir kişi kabuğa aşina değilse veya tarih değiştirme özelliklerini hiç kullanmadıysa, görünüşte zararsız, alıntısız veya çift tırnaklı dizeler onu tetiklediğinde açıkça bir sürpriz olacaktır.

Tarih ikameleri etkinleştirilmiş etkileşimli bir kabukta !karakter, $karakterin özel olduğu gibi özeldir, yani \tek tırnaklı dizelerle kaçılmadığı sürece her yerde .

Bunun yerine $, tarih ikameleri burada yer alan belgelerde genişlemez ve bunlar satır yönelimli olduklarından , ikame değerinin alıntılanmamış bir bağlamda veya çift tırnaklı bağlamda (ayrı olarak tarandığında bu satırda) olduğu satırlarda da gerçekleşir. . Daha fazla bilgi için bu hata raporuna bakın .

Etkileşim olmayan kabuklarda (komut dosyaları) geçmiş değiştirme özelliği, kabuğun komut geçmişi özelliğine ihtiyaç duyulmadığından, özelliğin "büyük sorunları" olması nedeniyle değil. Bir komut dosyasında, her komutu kaydetmek bir $HISTFILEanlam ifade etmez ve geçmiş değişikliği, bir komut dosyasında güvenmek istediğiniz bir şey değildir.

Etkileşimli kabuklarda varsayılan olarak etkinleştirilip etkinleştirilmeyeceği tartışılabilir (ancak burada bir tartışmanın bashgeliştiriciler için çok önemli olacağına ikna olmadım ). Çoğu bashkullanıcının tarih genişlemeleriyle ilgili sorun yaşadığını düşünüyor görünüyorsunuz , ancak hiçbiriniz ve ben bunları kullanmanın ne kadar yaygın olduğunu bilmiyoruz.

Unix mermileri, kabuğun davranışını kişinin kişisel ihtiyaçlarına ve zevkine uyacak şekilde değiştirmesine izin verir. Tüm etkileşimli kabuklarınız için geçmiş değişikliklerini kapatmak istiyorsanız set +H, ~/.bashrcdosyanızda kullanarak ne yaptığınızı yapmaya devam edin veya bashgeliştiricileri lobisinde varsayılanı değiştirmek için lobi yapın (ki, inanıyorum ki, yardımcı olacağından daha fazla insanı üzer ve karıştırırsınız) ).


2
@MikkoRantalainen Geçmiş değişikliğinin bashkullanıcıların çoğunluğunun kullandığı bir şey olmadığını düşünüyor görünüyorsunuz . İkimizin de ne kadar yaygın olduğunu bildiğini sanmıyorum. Bu konuyla ilgili ciddi düşünceleriniz varsa, bashposta listesine bir özellik / hata isteği göndermenizi öneririm . Bkz. Savannah.gnu.org/mail/?group=bash
Kusalananda

8
Sağ. Sorun aslında tarihin ikamesi ile ilgili değil, ama Bash'deki çift tırnakların diğer diller terimi kullandığı anlamda gerçekten tırnaklar değil, daha ziyade özel bir parantez gibi çalışıyor. @MikkoRantalainen, Bash'in herhangi bir özel şekilde tek tırnak içinde yorumlamasını istemediğiniz bir şeyi koymayı alışkanlık haline getirin !
leftaroundabout

5
@ leftaroundabout Yorum yaparak ne demek istediğinize bağlı. Çoğu dil, çıktı için dizelerdeki kontrol karakterlerini yorumlar (ancak yalnızca dizeleri karıştırırken kabuktaki gibi değil). Perl'in alıntı kuralları ek olarak kabuğun (değişken enterpolasyon) gibi çalışır. Herhangi bir programlama dilinde olduğu gibi, şu anda hangi dilde çalıştığını hatırlamak mümkün ise yardımcı olur.
Kusalananda

5
" Demek istediğim , bu çok nadir kullanılan özel bir karakter " diyebilirim ki tam tersi ... normal bir karakter !olarak kullanılır - WTF'leri yankılayarak - yakalanan insanların sayısı çok ağır basar tarihin yerini almak için hala kullanan kişi sayısı ile.
TripeHound

3
Suçu uygunsuz alıntıya saptırmak için -1. Yana !olduğunu değil özel en Bourne benzeri kabuklar, ne de bashkomut, insanlar makul olduğunu öğrenebilir hangi birçok yol vardır "$my_var some text!!"genişleyecek $my_varama !!. Ben Bourne benzeri üzerinde kabuk aşina var busybox ashve benim ilk karşılaşma bashgeçmişi ikamesi yapıldı ben interaktif kabuğunda bazı hızlı bir astar yapmaya çalışıyordu zaman bana onun tarafından ısırılan. Bourne benzeri mermilerin taşınabilir ve komut dosyası kullanımı konusunda yetkin kişiler, kullanırken en az bir kez ısırılır bash.
mtraceur

9

Tarih ikamesi yararlıdır. Örneğin,

% make-me-a-sandwich
make-me-a-sandwich: Permission denied
% sudo !!
Ok.

2
Yani? Yararlı bulursanız, etkinleştirebilirsiniz .bashrc.
Barmar


3
@Barmar ve yararlı bulmazsanız devre dışı bırakabilirsiniz. Komik simetri nasıl çalışır.
ocaklar

3
@hobbs Var olduğunu bilmiyorsanız, devre dışı bırakmayı nasıl bilebilirsiniz?
Barmar

2
Bu cevap, özelliğin yararlı olmasının bir nedenini açıklamak için iyi bir iş çıkarır. Bence OP , OP (ve bu stackexchange'te ilgili soruların birçoğunu soran insanlar gibi) bu davranışı şaşırtıcı / beklenmedik bulsa bile, bu yararlılığın neden bu davranışı haklı çıkarmak için yeterli olduğunu anlamak istiyor .
mtraceur

4

Sosyal / kültürel atalet.

Ben olsun veya olmasın özelliği hakkında ileri herhangi görüş koymadan, bu açıdan cevaplamak için gidiyorum bu yüzden bu soru, nasıl insanlar-iş problemi uzayda olduğu gerektiğini varsayılan olarak açık olması.

Eğer özelliği kapatmak için yolumdan gitmek zorunda hissediyorsun sıkıntı, onlar sıkıntı olduğunu düşünüyoruz, diğer tarafı anladığımdan emin olmak için, başlamak için olur onlar açmak için kendi yolumdan gitmek zorunda hissediyorum özellik.

Yukarıdakileri, yeterince bashkullanıcının kullanması gerçeğiyle birleştirin, varsayılan olarak kaldırma veya kapatma önerileri, varsayılan olarak orada bulunmasından rahat olan kişilerin direnci ile karşılanır.

Ayrıca, bashbirçok kişi için varsayılan kabuktur ( sadece varsayılan giriş veya sistem kabuğu anlamında değil, psikolojik anlamda). Kabuk alıntı için referans çerçeveniz bash, ilk önce öğrendiğiniz kabuksa, !özel bir kabuk karakteri olması sizin için doğal ve otomatik hissedecektir (veya en azından ilk öğrendiğinizde, sadece Kabuğun olduğu gibi, birçoğu arasında kabul etmek için sadece bir tuhaflık).

Ve bunu düşünürseniz, birçok bashkullanıcı muhtemelen tarih ikamesi sözdizimiyle olumlu bir bağlamda karşılaşır: bunu okurlar ya da birileri bunu gösterir ve ilk öğrenirken olası faydasını görürler bash.

Sadece diğer Bourne benzeri mermilerin çevre dünyasından geliyor, !özel olarak ısırılıyorsunuz ve bu yüzden onu olumsuz görmeye meyilli olacaksınız: Çünkü eğer özelliğe hiç sahip olmadığınız kabuklara alışkınsanız, o zaman ilk aceleyle bir şeyler yapmaya çalıştığınızda sizi vidaladığı zaman olacaktır.

TL; DR: Çoğu kullanıcı muhtemelen her iki şekilde de varsayılanın ne olduğunu umursamıyor , bazı kullanıcılar bu özelliği seviyor ve zaten bu şekilde olmasının güçlü avantajına sahipler ve bu özelliğe karşı aktif olarak savunucu yeterli insan yok üstesinden gelmek.


2
Hayır, sadece diğer mermilerden geldiğinde değil. Ben yıllardır bu özelliği tanıyorum bashve tek alıntı olarak hala sürpriz Isırılmayın her zaman işe yaramaz üzerinde !nedeniyle kırık bir bashuygulaması.
Philippos

@Philippos Bu korkunç (iyi, tam olarak korkunç değil ... ama bir tür üzücü negatif nitelik). Bunu işaret ettiğiniz için teşekkürler. Entegre etmenin iyi bir yolunu düşündüğümde, cevabınızı benim yanıtım üzerinde çalışmak için bu cevabı daha sonra tekrar gözden geçirmeye çalışacağım.
mtraceur

2

Bash geçmişi ikamesi neden varsayılan olarak hala etkindir?

Birçok kişi bunu kullanabilir ve muhtemelen bir interaktif bash kabuğunu kullanan kişilerin Çünkü gerektiğini sorunlardan kaçınmak için kuralları bilmek ve genellikle bulacaksınız daha acıyor daha yardımcı olur.

Benim .bashrc uzun yıllar boyunca set + H'yi içeriyor, ancak bazı insanlar hala bu özellikten ısırılıyor.

Bu, kullanmadığınız bir özelliktir, bu, kullanıcıların çoğunluğunun kullanmadığı anlamına gelmez. Varsayılanın değiştirilmesi için dilekçe verebilirsiniz, ancak A) ilgilenen insanların kısmına ve B) bunu tercih ettiğiniz kişilerin oranına bakmanız gerekir. Önemseyen ve sevmeyen insanlar muhtemelen zaten devre dışı bıraktı. Bunu değiştirmek, yeni bir bilgisayarda hesap açtıklarında yardımcı olacaktır. Bu İnsanlar bakımı ve bunun gibi yap gelecekte olsun, kullandıkları her bilgisayar ve her hesapta ayarlarını güncellemek gerekir.

Hemen hemen herkesin kopyala yapıştır özellikli terminaller kullandığı göz önüne alındığında

Bence daha karmaşık bir seçenek ...

bu özelliğe sahip olmak için gerçekten herhangi bir neden var mı? Tüm komut dosyaları için varsayılan olarak devre dışı bırakılsa bile varolan komut dosyalarının hiçbiri bozulmaz.

Evet, insanlar bunu faydalı buluyor. Kanalı yeni alıp kanalı değiştirebildiğiniz için uzaktan kumandayı kullanmanın faydası nedir?

(Açıkçası, tüm komut dosyaları için varsayılan olarak devre dışı bırakılmışsa ve yürütmeden önce sonuçları doğrulamak için bir özellik varsa, önemli sorunlar vardır: shopt -s histverify.)

Tarih komut dosyalarında gerçekten anlamlı değil, daha da önemlisi güvenlik sorunlarına neden olabilir. Sizin durumunuzda tek tırnak kullanarak sorunu önleyebilirsiniz. Bunun benim için bir soruna neden olduğunu hatırlamıyorum, bu yüzden 'büyük sorunları' olduğunu nasıl söyleyebileceğinizi bilmiyorum. Bu sizin için gerçek bir soruna yol açtı mı yoksa varsayılanlarınızı yeni bir bilgisayarda ayarlamak zorunda kaldınız mı?

Aslında biraz para almak istiyorsanız kaçmak veya tek tırnak kullanmaktan farklı olduğunu görmüyorum:

$ echo "Give me $50 or the cat gets it"
Give me $0 or the cat gets it

2
İlgili sorulara bakın (sağ sütun); soruların çoğu yanlışlıkla bu özelliğe vuruyor ve kabuğun kırıldığını varsayın. Şahsen bu özelliği uzun zaman önce yanlış çıktıya neden olan karakter dizisini kullandığım için öğrendim. Ben tarafından kaydedildi olurdu shopt -s histverifyama o varsayılan olarak değildi. Buna ek olarak, hata mesajının şifreli ("olay bulunamadı") ve tetiklenmesi zor olan karakter sırası nedeniyle sebebi kendiniz bulmak oldukça zordur.
Mikko Rantalainen

1
İnsanlar bu özellikten gerçekten ısırılırlar çünkü $içeride özel olmak gibi "evrensel" kabuk sözdizimi özellikleri "...", insanların kabuk hakkında öğrendikleri ilk şeylerden biridir, ancak !içerideki özel "..."(ancak etkileşimli modda) gerçeği daha az bilinir, tipik olarak hemen / belirgin olarak öğretilmez ve bash-özeldir. Ayrıca, Bourne benzeri kabuklar çoğunlukla komut dosyasındaki metin ile etkileşimli kabuktaki metin arasında bir simetriye sahiptir, böylece genellikle birinden diğerine kopatabilir ve aynı şekilde çalışmasını sağlayabilirsiniz - ve bu özellik tek istisnalardan biri.
mtraceur

1
Ben kaçmak veya tek tırnak kullanmak zorunda daha farklı nasıl görmüyorum True zshtek alıntı yaparken !hep ama için çalışan bashuygulama üreten nerede, beklenmeyen sonuçlar . Diyorsun ki, kuralları bilmeliyiz, bu bağlantılı kuralı biliyor muydun?
Philippos
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.