2011-02-05 18 views
16

Vuoi creare un alias di questo comandocome sfuggire apice singolo durante l'impostazione alias

find . -name '*.sh' -exec chmod a+x '{}' \; 

e io non sono in grado di sfuggire le virgolette singole durante l'impostazione l'alias

alias mx='find . -name '*.sh' -exec chmod a+x '{}' \;' 

Qualsiasi aiuto è apprezzato

+1

vedono questo http://stackoverflow.com/questions/1250079/bash-escaping-single-quotes- stringhe all'interno di una singola virgoletta quando hai bisogno di virgolette e virgolette singole – yvess

risposta

15

Si può solo usare le virgolette:

alias mx="find . -name '*.sh' -exec chmod a+x {} \;" 

EDIT: Inoltre, le virgolette singole ' intorno al {} non è necessario.

+0

Hai anche bisogno di sfuggire alla barra rovesciata dal momento che stai usando virgolette doppie? '" ... chmod a + x {} \\\; "' –

+0

Funziona bene. Per tua conoscenza, quando creo un alias del genere, (GNU bash, versione 4.3.11 (1)) cambia automaticamente le virgolette in virgolette singole e converte tutte le virgolette singole in ''\' ''. Quindi l'alias mx sopra diventa 'alias mx = 'find. -name '\' '*. sh' \ '' -exec chmod a + x {} \; ''tutto da solo, simile alla risposta di Mark (anche buona). – Xen2050

14

Quello che vuoi è una funzione, non un alias.

function mx { 
    find . -name '*.sh' -exec chmod a+x '{}' \; 
} 

Ciò avrà lo stesso effetto di un alias avrebbe avuto, evita qualsiasi "soluzioni creative" per rendere il lavoro, ed è più flessibile dovrebbe mai bisogno di flessibilità. Un buon esempio di questa flessibilità, in questo caso, è che consente all'utente di specificare la directory da cercare e di impostare automaticamente la directory corrente se non viene specificata alcuna directory.

function mx { 
    if [ -n $1 ]; then 
    dir=$1 
    else 
    dir='.' 
    fi 
    find $dir -name '*.sh' -exec chmod a+x '{}' \; 
} 
12

Le altre risposte contengono migliori solutiuons in questo (e la maggior parte) dei casi, ma potrebbe per qualche ragione voglia di fuggire ', si può fare '"'"' che finisce in realtà la corda, aggiunge un ' sfuggito da " e avvia nuovamente la stringa.

alias mx='find . -name '"'"'*.sh'"'"' -exec chmod a+x {} \;' 

Maggiori informazioni presso How to escape single-quotes within single-quoted strings?

+2

non sai come mi hai salvato il culo. Due giorni stavo soffrendo. '\' ', \ x27 blah blah nulla mi ha aiutato. Infine "" "" mi ha aiutato. +1 per questo. – Reuben

1

Prova

alias mx=$'find . -name \'*.sh\' -exec chmod a+x \'{}\' \\;' 

Da man bash:

Parole del 'stringa' forma $ sono trattati in modo speciale. La parola si espande in stringa, sostituendo i caratteri con escape backslash come specificato dallo standard ANSI C. sequenze di escape backslash, se presenti, vengono decodificati come segue:

\\  backslash 
    \'  single quote 
    \"  double quote 
    \n  new line 
    ... 

Vedere esempio:

echo $'aa\'bb' 
Problemi correlati