signification de "'" (apostrophe) dans les commandes du terminal

11

Pour une raison étrange, j'ai essayé "" "comme séparateur de mots dans les identificateurs, comme dans:

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

Le résultat est comme indiqué ci-dessus, l' id est que l'invite passe à ">" et le système attend évidemment plus d'informations de ma part. Comme vous le voyez, j'ai dû appuyer sur Ctrl-C pour m'échapper. La même chose se produit en utilisant d'autres commandes telles que

$ ls foo'bar
$ mkdir foo'bar

Je suis curieux de savoir tout cela, c'est ce que le sens spécial "" "a dans les commandes de terminal (si spécial en fait qu'il est démonté même à l'intérieur des identifiants).

Extra: En passant, je voudrais également connaître l'ensemble des caractères spéciaux ou non valides dans les noms de fichiers et de dossiers, à la fois sous les systèmes Unix et Windows (pour obtenir le sous-ensemble commun de caractères sûrs) (en particulier, qu'en est-il de tous non ASCII?).

Merci Denis

denis 63
la source
Dans le monde Linux, tous les caractères à l'exception de \ 0 (null) et / sont autorisés. Cependant, cela ne signifie pas qu'ils sont tous recommandés. Beaucoup de gens considèrent qu'il vaut mieux éviter les caractères qui ont une signification particulière pour le shell. Si vous souhaitez en savoir plus sur Windows, consultez une référence Windows.
Scott Severance

Réponses:

15

Le caractère 'est un caractère très puissant lorsqu'il est utilisé dans n'importe quelle commande shell. Fondamentalement, le '(marques d'apostrophe) désactive toutes sortes de transformations ou de modifications. Il considérerait tout ce qui est entouré des marques comme une entité unique, c'est-à-dire un paramètre unique. Il n'y aurait absolument aucune sorte de substitution ou d'expansion.

Exemple:

 $ echo '$HOME'

produirait à la sortie la chaîne $HOMEelle-même et n'imprimerait pas le chemin vers votre répertoire personnel. Étant donné que les guillemets simples empêchent toute sorte d'expansion, la substitution et simple considère tout ce qui est présent comme un simple paramètre en soi.

Si vous souhaitez utiliser l'apostrophe telle quelle, vous devez y échapper:

 $ mkdir foo\'bar

 $ cd foo\'bar

S'il n'est pas échappé, il attendra que sa paire soit fermée, comme cela s'est produit dans votre premier exemple.

Donc, corrigé, votre commande sera:

 $ export foo\'bar=1

REMARQUE: comme l'a remarqué Milan Todorovic, cela ne sera pas valide, car vous ne pouvez pas utiliser d'apostrophe dans ce cas.

Frantique
la source
1
@ denis63 veuillez accepter la réponse si c'est ce que vous aviez besoin de voir :)
Rinzwind
7

Le caractère 'est un caractère spécial. Vous l'utilisez pour marquer une partie de l'entrée de ligne de commande qui ne sera pas modifiée (par exemple, aucun remplacement pour les caractères génériques). Par exemple:

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

Cela signifie que l'argument pour lsétait bla*et non pas tout ce qui commence par bla.

La raison pour laquelle vous obtenez du >caractère est que vous devez en utiliser un 'pour ouvrir et un 'pour fermer la partie qui ne sera pas modifiée.

Si vous souhaitez utiliser 'dans les noms de dossier , vous devez échapper comme ceci: \'. Donc, si vous souhaitez répertorier le dossier nommé, foo'barvous devez taper ls foo\'bar.

Oh, et je ne sais pas s'il est possible d'utiliser 'dans les noms de variables d'environnement. Je pense que vous ne pouvez pas utiliser export foo\'bar=1,

J'espère que cela t'aides.

Milan Todorovic
la source
Upvote pour votre observation sur la restriction de nom de variable d'environnement.
Frantique
Je ne peux pas encore voter (nouveau sur askubuntu), mais le sentiment est là. Vérifié sur les noms de var env, c'est comme vous le dites. (Je me sens un peu stupide de ne pas avoir pensé à ouvrir / fermer les délimiteurs moi-même, mais j'ai alors considéré "'" comme une véritable apostrophe, pas un guillemet simple). Denis
denis 63