Come si inserisce una directory il cui nome è solo un meno?


26

Ho scaricato lessn sul mio server web e decompresso.

Contiene una cartella denominata -. Ho pensato di sapere come affrontarlo, ma non lo so.

Ho provato cd -- -, ma questo non ha l'effetto desiderato. Anche l'uso delle virgolette non sembra influenzarlo. Ho messo delle barre ovunque, inutilmente.

Qual è il modo corretto di cambiare in questa cartella?

Risposte:


34

Vuoi evitare che sia un parametro, quindi proviamo a anteporre qualcosa ad esso. È possibile accedere alla directory corrente con ., quindi è -possibile accedere alla sottocartella in alternativa con ./-.

cd ./-

Il motivo che cd -- -non funziona è perché questo è implementato in modo diverso se si confronta rm(vedi man rm) con cd(vedi man basho man cd), cdha un'interpretazione diversa che vede -come un parametro (vedi man basho man cd).

Va anche notato che cdè una funzione integrata della shell, come si può leggere in questa risposta :

cdnon è un comando esterno - è una funzione integrata nella shell. Funziona nel contesto della shell corrente e non, come fanno i comandi esterni, in un contesto fork / exec'd come processo separato.

C'è un cdcomando esterno , ma fa qualcosa di completamente diverso .

Questo spiega perché l'implementazione è diversa, poiché Bash e Coreutils sono due cose diverse.

Supponiamo che tu non ci creda, come possiamo confermarlo? Usa whiche type.

 $ which cd && type cd
which: no cd in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.7.2:/usr/games/bin
cd is a shell builtin
 $ which rm && type rm
/bin/rm
/bin/rm is /bin/rm

Vedere man whichper ulteriori informazioni e man basho man typepertype


4
No, "-" è implementato in tutte le utility standard, ma è destinato a terminare le opzioni. "-" da solo non è riconosciuto come opzione ma come directory precedente.
— Stéphane Chazelas,

4
Soluzione corretta, ma la spiegazione è errata. È completamente irrilevante che cdsia incorporato. La ragione per cui cd -- -non funziona è che -è un operando, non un'opzione.
— Gilles 'SO- smetti di essere malvagio' il

1
su Mac OS X cd -- -ti cambierà in una directory denominata -nella directory corrente. FWIW.
— Tim Kennedy,

La maggior parte dei commenti si sono riflessi nella seconda parte del mio post.
— Tamara Wijsman,

22

Un segno meno (aka dash) da solo non è un'opzione, ma un operando (ovvero un argomento che non è un'opzione). Per questo --motivo , metterlo davanti non ha alcun effetto. Il trattino è un operando in cd -e ancora un operando in cd -- -. Come altre utility standard, cdconsidera un operando come un operando indipendentemente dal fatto che sia presente --prima.

Il cdcomando assegna un significato speciale all'operando -. Qualcos'altro è una directory in cui passare. cd -- -apassa alla directory chiamata -a, perché -anon è speciale come operando e --impedisce cddi trattarla come un'opzione. Questo non funziona da -solo, che non è un'opzione.

Mettere le virgolette in giro -non aiuta, dal momento che alla fine passerebbe -comunque l'operando .

L'unica soluzione è quindi quella di trovare un altro modo di esprimere la stessa idea, ovvero un altro nome per la stessa directory. Fortunatamente, ce n'è uno semplice: se aggiungi ./prima un nome file relativo, significa sempre lo stesso file. La ./fa la differenza, che è irrilevante nel nostro caso: CDPATHnon viene consultato quando il nome della directory inizia con /, ./o ../. Così:

cd ./-

Un altro modo, poiché -è una directory, è quello di aggiungere un /dopo. L'aggiunta di /a alla fine del nome di un file garantisce che il file sia trattato come una directory (in particolare, il comando opererà sulla directory stessa e non sul link simbolico se il file è un link simbolico a una directory), ma in caso contrario nessuna differenza. Così:

cd -- -/

La scrittura -/è suggerita dal codice di completamento, a proposito, ma in bash in realtà funziona solo con --prima, bash non ha un caso speciale per cd -/(zsh lo fa).


Questo mi fa impazzire, in realtà ho provato cd -- -/, ma a causa dell'esecuzione dell'equivalente di cd -prima, la directory in realtà non esisteva e l'ho interpretata come un altro tentativo fallito.
— Der Hochstapler,

5

Qualificarsi con il percorso è un'opzione.

cd ./-

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.