Come posso proteggere le parentesi passate a un comando cd? [duplicare]

18

Ho chiesto qui come rendere cd proteggere gli spazi. Il completamento del tab è ottimo, ma a volte si incolla il percorso dagli appunti, quindi è utile.

La soluzione rompe con parentesi comunque. Indipendentemente da come provi a scappare ea proteggere l'input, restituisce sempre:

bash: syntax error near unexpected token '('

C'è un modo per avere anche a che fare con le parentesi? Quello che voglio è che quando inserisco questo, funziona:

cd My path with spaces (and parentheses)
    
posta Strapakowsky 30.03.2013 - 02:35

2 risposte

18

Utilizza virgolette singole ' attorno all'argomento. (Funziona per qualsiasi comando, non solo cd ).

cd 'My path with spaces (and parentheses)'

Non puoi fare bash passare le parentesi a cd . Ottenere gli spazi per lavorare è un trucco molto specializzato.

Le virgolette singole funzionano su ogni carattere tranne ' stesso. Sostituisci le virgolette singole con la sequenza di 4 caratteri '\'' .

cd 'Apostrophe'\''s a pain'

Questo non funziona se il nome della directory inizia con un trattino, poiché ciò fa sì che il comando cd interpreti l'argomento come un'opzione. Supera -- prima del nome della directory per evitare questo.

Vedi link per ulteriori dettagli.

Un altro metodo prevede che la shell legga una riga di testo separata anziché passare l'argomento sulla riga di comando.

[email protected] ~$ read -r; cd -- "$REPLY"
My path with spaces (and parentheses)
[email protected] ~/My path with spaces (and parentheses)$ 

Invece di copiare e incollare manualmente, si potrebbe anche farlo a livello di programmazione. Installa xclip o xsel .

cd -- "$(xclip -o -selection clipboard)"
cd -- "$(xsel -bo)"

Potresti renderlo un alias.

alias cde='cd -- "$(xsel -bo)"'
    
risposta data Gilles 30.03.2013 - 03:14
6

Come correttamente cd alle directory con caratteri come spazi e parentesi nei loro nomi:

Se il nome della cartella non include un carattere a virgoletta singola ' , racchiudilo tra virgolette singole:

cd 'My path with spaces (and parentheses)'

Se include un ' , ma non include un carattere doppia citazione " , un backlash \ , un backquote ' o un dollaro $ , racchiuderlo tra virgolette doppie:

cd "My path with spaces (and parentheses)"

Non è molto comune che un nome di file o directory contenga sia virgolette singole che doppie. (Ciò è forse dovuto al fatto che non è comune che il nome di un file o di una directory contenga doppie virgolette. L'unico motivo per cui non ho consigliato le virgolette in origine è che, a differenza delle virgolette singole, le virgolette doppie consentono a $ di espandersi variabili d'ambiente. Questo sarebbe un problema se il tuo nome file contenesse un carattere $ seguito da testo.)

Se contiene entrambi, o vuoi semplicemente un altro metodo, puoi sfuggire manualmente ogni spazio e parentesi inserendo un carattere barra rovesciata \ prima di esso:

cd My\ path\ with\ spaces\ \(and parentheses\)

È fastidioso, ma fortunatamente, la shell con lo fa per te , se digiti l'inizio del nome e premi Tab . Se è presente più di un nome di file o di directory che inizia con My , potrebbe essere necessario aggiungerne altri per farlo espandere. Se si preme Tab e non si espande, è possibile premere nuovamente Tab per visualizzare un elenco di file che corrispondono a ciò che è stato digitato finora. Quindi sai quanto altro devi digitare per farlo corrispondere in modo univoco ed espandere.

In alternativa, potresti evitare le virgolette interne. Ad esempio, supponi di avere una cartella chiamata:

Mischa's gardening tips for "home and office"

Puoi usare:

cd Mischa\'s\ gardening\ tips\ for\ \"home\ and\ office\"

Ma puoi anche semplicemente usare:

cd 'Mischa'\''s gardening tips for "home and office"'

Le barre rovesciate non sono speciali all'interno di virgolette singole, quindi terminiamo la stringa tra virgolette singole, aggiungiamo una virgoletta protetta dal backslash e avviamo immediatamente un'altra stringa con quotatura singola, il tutto senza spazi che avvierebbero un argomento separato.

Perché probabilmente non puoi fare in modo che cd funzioni nel modo desiderato:

Per far funzionare cd My path with spaces (and parentheses) : no, non puoi davvero farlo, perché questo comportamento non è specifico del comando cd , è parte del modo in cui funziona qualsiasi comando. Quando viene eseguito un comando, viene fornito un elenco di argomenti forniti dall'utente. Quando la shell vede uno spazio, sa che un argomento è appena finito e un altro è appena iniziato. Per passare uno spazio come parte di un argomento deve essere citato in uno dei modi sopra descritti.

Potresti ottenere parte di questo alcuni del tempo - potresti fare in modo che cd My path with spaces funzioni per entrare nella cartella My path with spaces . È possibile ottenere ciò scrivendo uno script di shell che concateni tutti gli argomenti forniti dall'utente con spazi. (Quindi se si volesse si potrebbe fare in modo che cd chiami quello script, creando un alias di shell chiamato cd per questo, che avrebbe la precedenza sulla shell incorporata cd che normalmente si sta eseguendo.) Ma:

  • Lo script non riceverebbe argomenti diversi per My path with spaces e My path with spaces , quindi cd My path with spaces fallirebbe o inserire la cartella sbagliata.

  • Non è possibile farlo per le parentesi, perché queste sono usate per il raggruppamento dalla shell in modo tale che non vengano comunicate in alcun modo a un comando. In realtà, la maggior parte delle volte la shell genera semplicemente un errore di sintassi (proprio come hai visto):

    [email protected]:~$ cd My path with spaces (and parentheses)
    bash: syntax error near unexpected token '('
    

    Indipendentemente da ciò che cambi, l'errore di sintassi continuerà a verificarsi quando viene fornito quel comando.

Dico che "probabilmente" non puoi far funzionare questo perché c'è un modo in cui lo farai: puoi creare il tuo guscio che si comporta come desideri. Ma questo è estremamente difficile ed è improbabile che qualcuno vorrebbe farlo, solo per fare questo cambiamento. (Puoi anche modificare il codice sorgente di una shell esistente, che è una soluzione più pratica ma richiede ancora più impegno di quanto la maggior parte delle persone vorrebbe esercitare.) Inoltre, è improbabile che cd possa accettare nomi di directory con caratteri arbitrari tra cui spazi in essi, come fa su Windows.

Nel caso ti stia chiedendo perché funziona su Windows ma non su Ubuntu: In Windows, i comandi vengono passati al testo digitato come una stringa di testo e quando un comando deve interpretare quella stringa come una sequenza di argomenti separati (che di solito, ma non sempre, fa), il codice per il comando deve chiamare una funzione di libreria speciale che analizza la stringa della riga di comando. (In un programma in C, questo accade dietro le quinte, ma implica ancora l'utilizzo dell'API di Windows.)

    
risposta data Eliah Kagan 30.03.2013 - 03:05

Leggi altre domande sui tag