CD vs Percorso completo per comando


-1

Che cosa è più veloce o considerato la migliore pratica negli script di shell per prima Cd in una directory quindi eseguire comandi o scrivere il percorso completo? Ad esempio: è meglio scrivere cd /directory1/e poi mkdir subdirectory/o mkdir /directory1/subdirectory/.

E se fosse necessario eseguire alcuni comandi in una directory (nell'esempio sopra fare alcune sottodirectory), la risposta cambierebbe?

Quando dici che mkdir /directory1/subdirectory/è, in realtà, fare cd /directory1/e poi mkdir subdirectory/o no?

mkdir è solo un esempio ma la domanda può applicarsi a molti comandi simili.

Risposte:


3

Questo è davvero qualcosa che spetta a te decidere. Ciò che potrebbe influenzare quella decisione potrebbe essere qualcosa di simile al fatto che abbia un bell'aspetto o sia leggibile. In termini di velocità di esecuzione, non farebbe molta differenza.

Possibilità di creare tre sottodirectory nella directory preesistente /path/to/dir:

mkdir /path/to/dir/a \
      /path/to/dir/b \
      /path/to/dir/b
( cd /path/to/dir && mkdir a b c )

(la subshell consente di saltare cdindietro alla directory di lavoro originale)

Con una shell che conosce le espansioni di parentesi graffe (questa è essenzialmente la stessa della cdprecedente versione senza nome poiché la shell espande l'espansione di parentesi prima di chiamare mkdir):

mkdir /path/to/dir/{a,b,c}

L' mkdirutilità probabilmente utilizzerà la mkdir()funzione di libreria C. Questa funzione non cambia le directory di lavoro prima di creare la directory che è impostata per creare 1 .

È diverso quando si eseguono script che si preoccupano di essere eseguiti in una particolare directory di lavoro. Se lo script prevede di trovare file utilizzando percorsi relativi fuori dalla sua directory di lavoro corrente, ovviamente dovrai assicurarti che la directory di lavoro sia corretta prima di eseguire il comando, possibilmente con

( cd directory && thescript )

... a meno che la sceneggiatura non faccia questo da sola.


1 Correzione Lieve: Su Linux, il comando mkdir -p a/b/c sarà chiamata mkdir("a"), chdir("a"), mkdir("b"), chdir("b"), mkdir("c"), mentre su OpenBSD sarà solo chiamare mkdir("a"), mkdir("a/b"), mkdir("a/b/c"). Su Linux, la creazione di un'unica directory aggiuntiva a/b/c/dcon mkdir a/b/c/dchiamerà semplicemente mkdir("a/b/c/d").

Quindi, su Linux, mkdir -pin effetti "farà" internamente un cdpercorso intermedio durante la creazione delle directory (mentre mkdirsenza no -pnon lo fa).

Il -pflag mkdirall'utilità fa sì che crei qualsiasi directory intermedia mancante, e ovviamente gli sviluppatori BSD e Linux lo fanno in modo leggermente diverso.


Potresti voler menzionare che esiste anche il problema della sicurezza di evitare il noto exploit di un altro utente che rinomina maliziosamente la directory principale quando una sequenza di comandi è in fase di esecuzione.
JdeBP,

-1

Fare un chdirin una directory e quindi usare nomi brevi per accedere ai file in quella directory è molto più veloce dell'uso di nomi di percorso assoluti per i file.

Dall'altro lato: se ci si trova in una directory specifica e si desidera chiamare un comando con molti argomenti relativi ai nomi di file che si trovano in directory diverse, è più sicuro e più facile comprendere quando vengono utilizzati nomi di percorso assoluti.

A proposito: se ti piace creare un percorso più lungo di directory ( a/b/c/...) e vuoi assicurarti che ogni directory in quell'elenco sia garantita per esistere dopo che il comando è pronto, è buona norma creare una directory, chdir in quella directory e poi continua con la directory successiva. Ciò consente di creare un percorso di directory così lungo anche nel caso in cui il percorso sia più lungo di PATH_MAX.

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.