significato di "'" (apostrofo) nei comandi del terminale


11

Per qualche strano motivo, ho provato "'" come separatore di parole negli identificatori, come in:

$ export foo'bar=1
> 
> ^C
$ 

Il risultato è come sopra indicato, id est il prompt cambia a ">" e il sistema attende, ovviamente, per ulteriori informazioni da parte mia. Come vedi, ho dovuto ctrl-C per scappare. Lo stesso accade usando altri comandi come

$ ls foo'bar
$ mkdir foo'bar

Sono curioso del senso di tutto ciò, questo è ciò che il significato speciale "" ha nei comandi terminali (così speciale infatti che viene smontato anche all'interno degli ID).

Extra: A parte vorrei anche conoscere il set di caratteri speciali o altrimenti non validi nei nomi di file e cartelle, sia in sistemi Unix che Windows (per ottenere il sottoinsieme comune di quelli sicuri) (in particolare, che dire di tutto non ASCII?).

Grazie Denis


Nel mondo Linux, sono ammessi tutti i caratteri tranne \ 0 (null) e /. Tuttavia, ciò non significa che siano tutti consigliabile. Molte persone pensano che sia meglio evitare personaggi che hanno un significato speciale per la shell. Se vuoi conoscere Windows, consulta un riferimento di Windows.
Scott Severance,

Risposte:


15

Il personaggio è un personaggio molto potente ogni volta che viene utilizzato in qualsiasi comando shell. Fondamentalmente il '(segni apostrofo) disabilita tutti i tipi di trasformazioni o modifiche. Considererebbe tutto ciò che è racchiuso tra i 'marchi come un'unica entità, cioè un singolo parametro. Assolutamente nessuna sostituzione o espansione avrebbe luogo.

Esempio:

 $ echo '$HOME'

produrrebbe all'output la stringa $HOMEstessa e non stampa il percorso della directory home. Poiché le virgolette singole impediscono qualsiasi tipo di espansione, la sostituzione e la semplice considerano qualsiasi cosa sia presente come un semplice parametro in sé.

Se vuoi usare l'apostrofo così com'è, devi scappare:

 $ mkdir foo\'bar

 $ cd foo\'bar

Se non viene evaso, attenderà la chiusura della sua coppia, come è successo nel tuo primo esempio.

Quindi, corretto, il tuo comando sarà:

 $ export foo\'bar=1

NOTA: come notato da Milan Todorovic, questo non sarà valido, perché in questo caso non è possibile utilizzare l'apostrofo.


1
@ denis63 accetta la risposta se è quello che
dovevi

7

Il personaggio 'è un personaggio speciale. Lo si utilizza per contrassegnare una parte della voce della riga di comando che non verrà modificata (ad es. Nessuna sostituzione per i caratteri jolly). Per esempio:

$ ls 'bla*'
ls: cannot access bla*: No such file or directory

Ciò significa che l'argomento per lsera bla*e non tutto ciò che inizia bla.

Il motivo per cui ottieni >carattere è perché devi usarne uno 'per l'apertura e uno 'per la chiusura della parte che non verrà modificata.

Se si desidera utilizzare 'nei nomi delle cartelle si deve fuggire in questo modo: \'. Quindi, se si desidera elencare la cartella denominata, foo'barè necessario digitare ls foo\'bar.

Oh, e non sono sicuro che sia possibile utilizzare 'nei nomi delle variabili di ambiente. Penso che non puoi usare export foo\'bar=1,

Spero che sia di aiuto.


Valorizza la tua osservazione sulla restrizione del nome della variabile d'ambiente.
Frantique,

Non posso ancora votare (nuovo su askubuntu), ma la sensazione è lì. Controllato sui nomi di env var, è proprio come dici tu. (Mi sento un po 'stupido a non aver pensato di aprire / chiudere da solo i delimitatori, ma poi ho considerato "" un vero apostrofo, non una singola citazione). Denis
denis 63
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.