È buona norma richiedere una barra rovesciata in avanti nei nomi delle directory?


9

Voglio chiedere all'utente del mio script bash di passare un percorso di directory come argomento. Quale delle seguenti è una buona pratica di programmazione?

  • Richiede che l'utente inserisca un trailing / (barra)
  • Richiede che un utente non inserisca un trailing / (barra)

3
Si noti che rsyncsi comporta in modo diverso in modo molto importante a seconda della presenza di trascinamento /, e quindi in alcuni casi si vorrebbe normalizzare per coerenza, e in altri si vorrebbe passare in modo pulito per implementare ciò che l'utente ha detto (se sapeva che stavano parlando rsync).
sh1,

Un altro che mi ha sorpreso di recente è che ls -l dirsi comporta in modo diverso ls -l dir/se dirè un link simbolico a una directory.
Flimm,

Risposte:


27

La migliore pratica è di non assumere nessuno dei due.

Se hai accesso alle utilità / classi del generatore di percorsi, usale, altrimenti scrivi il tuo codice per accettare entrambi i formati e agire di conseguenza.

Niente è più fastidioso per l'utente che dover ricordare se aggiungere una barra o meno.


6
Corollario: Sempre percorsi di parsing con gli opportuni strumenti della riga di comando - dirname, basenamee readlink. Un problema molto comune è l'utilizzo ${path##*/}come sostituto di basename, ma se il percorso termina con una barra che restituisce una stringa vuota anziché l'ultimo elemento del percorso.
l0b0

1
+1 per l'utilizzo delle classi di utilità. Non posso dire quante volte ho visto gli sviluppatori reinventare la ruota quando si tratta di assemblare percorsi, quando la maggior parte dei framework può farlo facilmente al giorno d'oggi.
RationalGeek,

1
Inoltre, sono molto seccato quando alcune applicazioni mi richiedono di farlo in un modo specifico. E a volte l'utente non può controllare come scrivere quel percorso: a volte lo scrive, quindi sì, scelgono di scrivere con o senza barra finale, ma nei casi in cui l'utente si completa automaticamente con TAB, molte shell inseriscono la barra finale, quindi vorresti che l'utente lo eliminasse? E ancora più fastidioso è quando un'applicazione si comporta in modo diverso se metti la barra finale in una directory passata come argomento ( rsyncti sto guardando)
Carlos Campderrós,

Di recente ho dovuto verificare una barra finale dall'input dell'utente da utilizzare con rsync (poiché è sensibile a queste cose). Come notato da @ChrisF, è consigliabile non assumere nessuno dei due. Ho trovato il seguente come un modo grazioso di assumere nessuno dei due: l' ${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))ho anche documentato in un senso per chiarezza: aggiungere o rimuovere la barra finale in bash
John Mark Mitchell,

10

Poiché bash ignora più barre, puoi tranquillamente supporre che l'utente non abbia inserito una barra finale nel percorso e aggiungere una barra da solo.

cat /etc/hosts

è lo stesso

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

Quindi la tua sceneggiatura potrebbe apparire così:

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

e non devi preoccuparti se l'utente inserisce o meno un trailing / nel percorso.


5
Nit: Questo non è un bashcomportamento, lo fa il kernel.
Blrfl,

7

Il defunto Jon Postel ha ricevuto alcuni ottimi consigli nella sezione 3.2 di RFC 760 che si applica qui:

In generale, un'implementazione dovrebbe essere conservativa nel suo comportamento di invio e liberale nel suo comportamento di ricezione. Cioè, dovrebbe essere attento a inviare datagrammi ben formati, ma dovrebbe accettare qualsiasi datagramma che possa interpretare (ad esempio, non opporsi a errori tecnici in cui il significato è ancora chiaro).


3

Concettualmente, la barra non fa parte del nome. La barra è solo un delimitatore tra i nomi. La mia home-dir è / home / stefan e non / home / stefan /.

Se non ti aspetti una barra finale, non fallirai se ce n'è una, come già notato da AmmoQ. Ma puoi facilmente incollare nomi e varianti, perché non devi citare la barra:

a="/home"
b="stefan"

dir=$a/$b

0

Richiedere che la directory non debba avere una barra finale sarebbe estremamente fastidioso per l'uso interattivo sulla console: il completamento automatico con TAB aggiunge automaticamente una barra finale per le directory.

Quindi è certamente necessario consentire che le directory siano specificate con barra finale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.