Neden 'ls' aniden boşluklu öğeleri tek tırnak içinde kaydırıyor?


187

Makinelerimden birinde (Debian Sid çalıştıran) lsboşluk içeren herhangi bir dosya adı yazdığımda onu çevreleyen tek tırnak işaretleri olduğunu fark ettim.

Hemen takma adlarımı kontrol ettim, sadece onları eksiksiz bulmak için.

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt
wyatt@debian630:~/testdir$ alias
alias ls='ls --color=auto'
alias wget='wget --content-disposition'
wyatt@debian630:~/testdir$

(resim)

Adlarında tek tırnak içeren dosyalar içeren başka bir test (ayrıca jimmij'in isteğini yanıtlayan):

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt  'thishasasinglequotehere'\''.txt'
wyatt@debian630:~/testdir$ touch "'test 1.txt'"
wyatt@debian630:~/testdir$ ls
''\''test 1.txt'\'''  test1.txt
'test 1.txt'          'thishasasinglequotehere'\''.txt'

(resim)

Yeni coreutils-8.26 çıkışı ile güncelleme (kuşkusuz daha az kafa karıştırıcı, ancak yine de varsayılan olarak tahriş edici). Bu çıktı için Pádraig Brady'e teşekkürler:

$ ls
"'test 1.txt'"   test1.txt
'test 1.txt'    "thishasasinglequotehere'.txt"

$ ls -N
'test 1.txt'  test1.txt
test 1.txt    thishasasinglequotehere'.txt

Bu neden oluyor? Doğru şekilde nasıl durdurabilirim?

açıklığa kavuşturmak için kendimi otomatik olarak renk çıktısına ayarlıyorum. Daha önce hiçbir şeyden alıntı yapmazdı.

Koşuyorum bashve 8.25 coreutils.

EDIT: Çekirdekciler geliştiricilerin (link) , 46+ yıllık UNIX geleneğinin yanı sıra en az şaşkınlık ilkesini çiğnemesine rağmen küresel bir varsayılan yapmanın iyi bir fikir olacağını düşündü .

Bir derleme olmadan bunu düzeltmenin bir yolu var mı?


GÜNCELLEME - Ekim 2017 - Debian Sid, varsayılan olarak kabuk çıkış teklifini yeniden etkinleştirdi. Bu sadece saçmalık oluyor. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877582

Ve önceki hata raporuna verilen yanıt zincirinin altında, "değişiklik kasıtlı olarak kalacaktır." https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813164#226

Bunun çözüldüğünü sanıyordum. Görünüşe göre öyle değil.

GÜNCELLEME: Nisan 2019: PHP'de bu değişikliğin neden olduğu çok büyük bir hata raporu buldum ls. Geliştiricilerin kafasını karıştırırken ve yanlış hata raporları oluştururken, değişikliklerinizi yeniden düşünmenin zamanı geldi.

Güncelleme: Android oyuncak kutusu lsşimdi buna benzer bir şey yapıyor, ancak tırnak işaretleri yerine ters eğik çizgi yapıyor. -Q seçeneğinin kullanılması, boşlukların 'soru işareti karakterleri' olarak oluşturulmasını sağlar (ne olduklarını kontrol etmedim, çünkü açıkça boşluk değiller), bu nedenle söz konusu cihazı kök salmadan bugüne kadar bulduğum tek düzeltme eklemek Bu bir komut dosyası ve bir kabuk başlatırken onu kaynak. Bu işlev lsbir terminalde sütunlar kullanır ve satır başına bir tane basarsa, aynı zamanda lsbir borudan geçtiği için sözlü basım alanlarını kandırır .

ls() {
    # only way I can stop ls from escaping with backslashes
    if [ -t 1 ]; then
        /system/bin/ls -C "$@" |cat
    else
        /system/bin/ls "$@" |cat
    fi
}

20
Bir başka neden de lsemri ayrıştırmamak .
jimmij,

12
Garip görünüyor, ancak yalnızca bir terminale yazdırırken etkinse, mantıklı geliyor. Bir dosya 'test' ve başka bir '1.txt' yerine 'test 1.txt' dosyanız olduğunu açıkça görebilirsiniz. Gitip ls | catgitmediğine bakmaya çalış. Eğer bir zaman makinem olsaydı, 1970'lerde Bell Laboratuarlarına geri dönerdim ve Ken Thompson'ı dosya ve dizin adlarında boşluk bırakmanın kötü bir fikir olduğuna ikna etmeye çalışırdım. :-P
Bjorn Munch,

6
Bunu ilk gördüğümde, senaryolarımdan birinin ters gittiğini ve tüm dosyalarımı yeniden adlandırdığını düşünerek korktum '*'. Sanırım lsondan kurtulmak için tüm makinelerime takma ad eklemeye devam edeceğim ...
Limited Atonement

14
@LimitedAtonement, Lekensteyn tarafından belirtildiği gibi , bunu QUOTING_STYLE=literalbir takma ad yerine bir ortam değişkeni ile yapabilirsiniz . (Sanırım bir zevk meselesi ama değişkeni tercih ediyorum.)
LSpice

4
@BjornMunch'ın bir dosya mı yoksa iki mi olduğunu söyleme konusunda iki çözüm var: 1) sütunların nasıl çizildiğine bakın ve oldukça açık. 2) satır başına bir öğe listeler. Her ikisi de, tek tırnak ile yapılan karışıklıktan daha iyi ve net görünüyor.
Wyatt8740

Yanıtlar:


132

Önsöz : bu t bir cevap upvote ve paydos etmek oldukça tatmin edici olsa da, GNU geliştiriciler & o, yaklaşık SO bakım oy cevap yok olduğundan emin olabilirsiniz aslında istiyorsanız teşvik etmek değiştirmek yapmanız gerekenler bu cevabın açıklandığı şekilde onlara e-posta gönderin


Bu neden oluyor?

Bazı coreutils geliştiricileri, onlarca yıllık fiili standartlardan daha iyi bildiklerine karar verdi.


" Doğru şekilde nasıl durdurabilirim? "

http://www.gnu.org/software/coreutils/coreutils.html :

Hata Raporları

Coreutils'te bir hata bulduğunuzu düşünüyorsanız, lütfen <bug-coreutils@gnu.org> adresine bir hata raporu gönderin. Lütfen otomatik olarak Coreutils hata izleyicisine girilecektir. Hata bildirmeden önce lütfen SSS bölümünü okuyun. Hata raporları nasıl yazılacağı ve iyi sorular sorulacağı hakkında çok yararlı ve sıkça başvurulan bir kılavuz, Akıllıca Nasıl Soru Sorulur belgesidir. Önceki yayınlara göz atabilir ve bug-coreutils arşivinde arama yapabilirsiniz.

 Bu değişikliği zaten geri alan dağıtımlar :

Etkilenmeyen dağıtımlar:

  • openSUSE (zaten kullanılmış -N)

" Bir derleme olmadan bunu düzeltmenin bir yolu var mı? "

Adaylar sana ...

ls aliaslarına -N ekleyerek eski formata dönün

… Tüm yüklemelerinize, her yere, sonsuzluğun geri kalanına.


17
Değişiklik posta listesinde önerildi ve üç çekirdek uzmanı tarafından net bir fayda olarak kabul edildi. Bu konuda yapıcı tartışmalara tamamen açığız. Sonuçta bu açık kaynak, sadece dikte etmek istemiyoruz, sadece şeyleri geliştirmek için. Lütfen lists.gnu.org/archive/html/coreutils/2016-02/msg00000.html adresindeki coreutils iş parçacığına cevap vermekten çekinmeyin (bu arada, burada belirtilen estetik dezavantajlardan birini geliştirmek için yapıcı bir öneri vardı, hizalamayı iyileştirmek için bir boşluk ekleyerek)
Pádraig Brady

31
@ PádraigBrady Cevaplandı Güncelleme. Yine de coreutils iş parçacığında inkar yüklerini görmek. Sonuç olarak, insanlar için daha fazla iş yaratıyorsunuz ve bunu 1970'ten beri bir işletim sistemi klonu olan bir işletim sistemi adına yapıyorsunuz. İnsanlar farklı bir şey isterlerse, bunu tercih edeceklerdir.
Jan Kyu Peblik

43
@ PádraigBrady Bu değişiklik bana bir sıkıntı yarattı ve bir neden bulmaya çalışırken bir kaç saat harcadı. Olumsuz olmak istemem - sadece başkalarının bakış açısını paylaşıyorum! Çekirdek davranışını değiştirmenin çok büyük etkileri var ..
mafroz

52
30 yıldır * nix sistemlerini kullanan biri olarak, bunun gibi saçma sapan değişiklikleri oldukça sinir bozucu buluyorum. Birincisi, uzun zamandır devam eden senaryoları kırdılar. Ayrıca, En Az Şaşkınlık İlkesini ihlal ediyorlar. Yukarıda listelendiği gibi "Kaydolma" burada varsayılan olmalıdır.
Brian Clapper

28
@ PádraigBrady Bu tür değişiklikleri zorlamanın yolu hala bu değil. Olurdu yolu o davranış Kaydolmayı yerine aktif varsayılan olarak sahip olmak daha yapıcı. Aynı zamanda yanlış bir şekilde bu, dosya adlarının nasıl kaydedildiğini, kısaca lsartık ne gördüğünüzü kaydetme şeklini gösterir. Bu özellik varsayılan değil isteğe bağlı olmalıdır .

91

Alıntılama stilini seçebilirsiniz :

ls --quoting-style=literal

Aynı:

ls -N

veya:

QUOTING_STYLE=literal ls

Takma ad yapın veya 8.25 öncesi davranış elde etmek export QUOTING_STYLE=literaliçin kendinize ayarlayın .bashrc.


11
biraz tuhaf görünüyor normal unix-y davranışını elde etmek için bunu yapmak zorundayım. Ayrıca, eski varsayılanı istiyorum. Kaçmanın eski bir varsayılan olduğunu düşünmüyorum - tam olarak orada olanı bastığını düşünüyorum.
Wyatt8740,

9
8.25 öncesi davranış için, export QUOTING_STYLE=literalbashrc'nizi kullanın .
Lekensteyn

2
veya kullanmak -N, öyle görünüyor. Zaten kişisel bir depo kurduğum için kendi versiyonumu derliyorum.
Wyatt8740,

2
@LSpice Yazının literalyerine kullanmak üzere yazıyı düzenledim escape(İnanıyorum ki @cuonglm sadece stili nasıl hedefleyeceğini değil, stilin nasıl değiştirileceğini göstermek istedi escape.)
Lekensteyn

5
Bu cevap daha fazla yükseltmeyi hak ediyor. Bürokratik bir cevaptan kaçınmak için sorgulayana ne sorduğunu doğrudan ele almaktadır. Aslında, çevre değişkeni yaklaşımı oldukça zarif görünüyor. (Ben şahsen yeni davranışı daha verimli bir C&P eylemi tercih ettiği için tercih ederim), yine de, yeniden yönlendirme kullanıldığında eski şekilde davranmak için yeterince zekicedir, bu yüzden ls 'in çıktısını kullanan komut dosyalarına zarar vermez.
Marcelo

42

Değişimle ilgili birkaç nokta.

  • Coreutils v8.25'te tanıtıldı ve v8.26'da hizalama iyileştirildi
  • Sadece terminallere çıktığı zaman olur, bu yüzden scriptleri bozmaz
  • Beyaz boşluk içeren dosyalar için kullanıcılar için çıktıyı açıklamıyor
  • Çıktıyı sterilize eder, böylece kopyalayıp yapıştırmak güvenlidir
  • Çıktı artık her zaman kabuğa kopyalayıp yapıştırmak için geçerlidir
  • Kullanıcılar, eski adlarına -N ekleyerek eski adlarına dönebilirler.

7
son örneğim belirsiz değil mi? Belki de değil - ama kesinlikle kafa karıştırıcı ve deşifre etmek daha fazla zaman alıyor. Bence bu korkunç bir değişim (size yönelik hiçbir suç). Takma isim ipucu için teşekkürler.
Wyatt8740,

27
Not: Bu değişiklik (coreutils 8.25 tanıtıldı işlemek , bu yazı ile aynı Padraig tarafından kaleme). Şahsen ben bu davranışın yetersiz olduğunu düşünüyorum, dosya adında bir boşluk oluştuğunda hizalamayı bozuyor.
Lekensteyn

10
Özür dilerim - görünüşe bakılırsa en azından kabuklardan alıntılar yapıyorsun. hala hoşuma gitmiyor. seçenekler gayet iyi - ancak on yıllardır süren bir unix çekirdek uygulamasının çok iyi tanımlanmış varsayılan davranışını, doğruluğunu azaltacak şekilde değiştirmek sadece kötü bir fikir olabilir.
mikeserv

12
@ PádraigBrady Yani, lskırık tutacak mısın? Değişiminize karşı tüm bu tartışmalara bakın. Kimse istemiyor. Belki de dünyadan özür dileme ve geri alma zamanı gelmiştir.
Chris Warrick

6
@ PádraigBrady Öyleyse, bunun nasıl yanlış, kırılmış vb. Olduğunu açıklayan birçok insana rağmen, varsayılanı değiştirmeden bu duruma geri dönmeyeceksiniz. Senin inancın aksine, bu değişiklik karıştırır değil belirsizliği ortadan kaldırır. İnsanların bir ortam değişkeni veya takma ad belirlemesini önermek en iyi ihtimalle asininedir.
Mark
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.