Dizin adlarında sondaki eğik çizgiyi gerektirmek iyi bir uygulama mı?


9

Benim bash betiğimin kullanıcısından bir dizin yolunu bağımsız değişken olarak geçmesini istemek istiyorum. Aşağıdakilerden hangisi iyi bir programlama uygulamasıdır?

  • Kullanıcının bir son / (eğik çizgi) girmesini zorunlu kılma
  • Kullanıcının sondaki / (eğik çizgi) girmemesini zorunlu kılma

3
Not o rsyncfarklı çok önemli bir şekilde davranacağını Römorkun varlığına bağlı /ve bu yüzden bazı durumlarda tutarlılık için normalleştirmek isterdim, diğerlerinde kullanıcı neyi uygulamak için temiz bir şekilde geçmesine isterdim söyledi (onlar eğer konuştuklarını biliyordu rsync).
sh1

Son zamanlarda beni şaşırtan bir başka ise , bir dizine bir sembolik bağlantı olması durumunda ls -l dirfarklı davranmasıdır . ls -l dir/dir
Aralık'ta Flimm

Yanıtlar:


27

En iyi uygulama hiçbirini varsaymamaktır.

Yol oluşturucu yardımcı programlarına / sınıflarına erişiminiz varsa, bunları kullanın, değilse, her iki biçimi de kabul etmek ve buna göre hareket etmek için kodunuzu yazın.

Kullanıcı için sondaki eğik çizgi ekleyip eklemeyeceğinizi hatırlamaktan daha rahatsız edici bir şey yoktur.


6
Sonuç: Yolları her zaman uygun komut satırı araçlarıyla ayrıştırın - dirname, basenameve readlink. Çok yaygın bir sorun ${path##*/}yerine geçiyor basename, ancak yol son yol öğesi yerine boş bir dize döndüren bir eğik çizgiyle bitiyorsa.
l0b0

1
Yardımcı sınıfları kullanmak için +1. Yolların montajı söz konusu olduğunda, günümüzde çoğu çerçevenin bunu kolayca yapabileceği durumlarda geliştiricilerin tekerleği kaç kez icat ettiğini gördüm.
RationalGeek

1
Ayrıca, bazı uygulamalar bunu belirli bir şekilde yapmamı gerektirdiğinde çok rahatsızım. Ve bazen kullanıcı bu yolu nasıl yazacağını kontrol edemez: Bazen yazıyorlar, bu yüzden evet, eğik çizgi ile ya da eğik çizgi olmadan yazmayı seçiyorlar, ancak kullanıcının TAB kullanarak otomatik olarak tamamladığı durumlarda, birçok kabuk izleyen eğik çizgiyi koyuyor, böylece kullanıcının silmesini ister misiniz? Ve daha da can sıkıcı bir uygulama farklı davrandığında, argüman olarak geçen bir dizine eğik çizgi koyarsanız ( rsyncsize bakıyorum)
Carlos Campderrós

Son zamanlarda (bu şeylere duyarlı olduğu için) rsync ile kullanmak için kullanıcı girişinden bir eğik çizgi doğrulamak gerekiyordu. @ChrisF'in belirttiği gibi, hiçbirini varsaymamak en iyi uygulamadır. İkisini de varsaymak için zarif bir yol olarak geldim: ${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))Açıklık için bir özette de belgeledim: bash'daki sondaki eğik çizgiyi ekleyin veya kaldırın
John Mark Mitchell

10

Bash birden fazla eğik çizgiyi yok saydığından, kullanıcının yolda bir eğik çizgi girmediğini ve kendinize bir eğik çizgi eklemediğini güvenle varsayabilirsiniz.

cat /etc/hosts

aynı

cat /////etc//////////hosts

Betiğiniz şöyle görünebilir:

echo -n "enter path: "
read path
if [ -f $path/myfile ]
then
  echo "found myfile!"
else
  echo "nope"
fi

ve kullanıcının yola bir iz / girip girmeyeceği konusunda endişelenmenize gerek yoktur.


5
Nit: Bu bashdavranış değil , çekirdek bunu yapıyor.
Blrfl

7

Geç Jon Postel bölümünde 3.2'de bazı büyük tavsiye vardı RFC 760 burada da geçerlidir:

Genel olarak, bir uygulama gönderme davranışında muhafazakâr ve alma davranışında liberal olmalıdır. Yani, iyi biçimlendirilmiş datagramlar göndermeye dikkat etmeli, ancak yorumlayabileceği herhangi bir datagramı kabul etmelidir (örneğin, anlamın hala açık olduğu teknik hatalara itiraz etmeyin).


3

Kavramsal olarak, eğik çizgi adın bir parçası değildir. Eğik çizgi, isimler arasında sadece bir sınırlayıcıdır. Benim ev-dir / ev / stefan ve / ev / stefan / değil.

Sondaki eğik çizgi beklemiyorsanız, ammoQ'nun belirttiği gibi, varsa başarısız olmazsınız. Ancak adları ve değişkenleri kolayca yapıştırabilirsiniz, çünkü eğik çizgiyi alıntılamanız gerekmez:

a="/home"
b="stefan"

dir=$a/$b

0

Dizinin sonunda eğik çizgi olmaması gerektiğinden, konsolda etkileşimli kullanım son derece can sıkıcı olur: TAB ile otomatik tamamlama, dizinler için otomatik olarak bir eğik çizgi ekler.

Bu yüzden kesinlikle dizinlerin sondaki eğik çizgi ile belirtilmesine izin vermeniz gerekir.

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.