Comment avez-vous tapez un onglet dans un bash ici-document?
La définition d'un ici-document est ici:
http://en.wikipedia.org/wiki/Here_document
Comment pouvez-vous vous tapez un onglet dans un ici-document? Comme ceci:
cat > prices.txt << EOF
coffee\t$1.50
tea\t$1.50
burger\t$5.00
EOF
Mise à JOUR:
Questions traitées dans cette question:
- L'expansion de la onglet caractère
- Tandis que ne pas étendre l' signe dollar
- Intégration un ici-doc dans un fichier, par exemple un script
- ce site est également intéressant:tldp.org/LDP/abs/html/abs-guide.html#GENERATESCRIPT
Vous devez vous connecter pour publier un commentaire.
Vous pouvez intégrer votre ici doc dans votre script, et l'assigner à une variable sans l'aide d'un fichier séparé à tous:
Puis
printf
ouecho -e
permettra d'élargir le\t
personnages dans des onglets. Vous pouvez l'imprimer vers un fichier:Ou affecter la valeur de la variable à l'aide d'
printf -v
:Maintenant
var
ou le fichierprices.txt
contient des onglets au lieu de\t
.Vous pourriez traiter votre ici doc que c'est de lire au lieu de les stocker dans une variable ou d'écrire dans un fichier:
Notez que j'ai utilisé
<<-
pour le doc de l'opérateur dans ce cas. Cela me permet d'indenter les lignes de la doc ici pour des raisons de lisibilité. L'indentation doit compose des onglets uniquement (pas d'espaces).TAB=$'\t'
, abusant de ses fonctions gettext.Pour moi, je tape ctrl-V suivie par ctrl-I pour insérer une tabulation dans le shell bash. Il obtient autour de la coque de l'interception de l'onglet, qui a par ailleurs un "spécial" de sens. Ctrl-V suivie par un onglet devrait fonctionner aussi.
Lors de l'incorporation de signes dollar dans un ici document, vous devez désactiver l'interpolation de variables shell, ou d'autre préfixe chacun avec une barre oblique inverse pour échapper (c'est à dire
\$
).À l'aide de votre exemple de texte j'ai fini avec ce contenu prices.txt:
parce que
$1
et$5
ne sont pas définies. L'Interpolation peut être éteint en citant le terminator, par exemple:Comme d'autres l'ont dit, vous pouvez taper CTRL-V puis tab pour insérer un seul onglet lors de la frappe.
Vous pouvez également désactiver bash onglet-achèvement temporairement, par exemple, si vous voulez coller le texte ou si vous souhaitez taper un long ici-doc avec beaucoup d'onglets:
EDIT: Si vous êtes sur Mac et utiliser iTerm 2, il y a maintenant un "Coller avec littérale onglets" l'option qui permet de coller du code, avec des onglets sur la ligne de commande bash.
Je remarque que la bonne réponse a déjà été donné, mais je tente de résumer en une nouvelle réponse.
1. Il n'y a rien pour vous empêcher d'avoir littérale des caractères de tabulation dans un document ici.
De type littéral onglet à l'invite Bash, vous devez vous échapper. Le caractère d'échappement est ctrl-V (à moins d'avoir des liaisons personnalisées pour remplacer ce).
Dans la plupart n'importe quel programmeur de l'éditeur, il doit être facile à insérer un littéral caractère de tabulation (bien que certains éditeurs pourraient vouloir s'échapper, trop. Dans Emacs, ctrl-Q ONGLET insère une tabulation littérale).
Pour des raisons de lisibilité, il pourrait être préférable d'utiliser une sorte d'échapper à la place d'un littéral caractère de tabulation. En Bash, le $'...' syntaxe de la chaîne est pratique pour cela.
2. > Pour éviter l'expansion des variables, citer tous les signes dollar, ou de mettre la doc ici terminator dans les citations.
Dans ce contexte, il n'a pas d'importance si vous utilisez des guillemets simples ou doubles.
3. je ne suis pas sûr de comprendre ce subquestion. Le but d'un document ici est de l'intégrer dans un script. L'exemple précédent montre comment passer un ici le document à convertir dans un script, ou à la ligne de commande.
Si vous souhaitez utiliser ici la même document à plusieurs reprises, il n'y a pas de façon simple de le faire directement. Le script pourrait écrire ici un document dans un fichier temporaire, puis passer le fichier temporaire pour plusieurs commandes, puis effacer le fichier temporaire. (Prenez soin d'utiliser
trap
pour supprimer le fichier temporaire également dans le cas où le script est interrompu.)Vous pouvez également placer le contenu du document ici dans une variable, et d'interpoler que.
Vous pourriez utiliser de manière équivalente
echo -E "$data" | wc; echo -E "$data" | grep -c $'\t'
mais l'utilisation de l'écho n'est pas très élégant et pourrait être moins portable (si votre cible est bash, tous les echos devrait être le même. Si votre cible est Bourne shell en général, vous pouvez également passer d'un processus externe pour chaque écho).Voici une version plus courte de Dennis Williamson est réponse. De l'Inspiration à partir d'ici: http://tldp.org/LDP/abs/html/here-docs.html.
Re: subquestion #3, j'ai lu cette question:
Utiliser le nom du script dans la sortie de la doc ici, en ajoutant plutôt que de les remplacer, en supposant que l'exécuteur a également des autorisations d'écriture. Shell commentaires ne sont pas interprétés lors d'un ici doc bloc.
D'une manière similaire, vous pouvez utiliser un ici doc pour écrire un nouveau script développant des variables à des valeurs, exec, puis vous avez un enregistrement exact de ce qui a été exécuté au lieu d'avoir à retracer le code.
Onglets qui sont collées dans une heredoc disparaître, parce que
bash
est encore de les interpréter comme des caractères spéciaux, marquant le début d'une auto-achèvement de la séquence/demande.Si vous voulez coller rapidement un heredoc dans le shell en cours, vous pouvez le faire par la désactivation de l'auto-complétion pour la vie du shell courant.
Voici ce qui se passe avec la normale de l'auto-complétion si vous collez un heredoc contenant des onglets:
Exécuter cette commande:
bind "set disable-completion on"
La pâte à nouveau et vos onglets sont retenus:
Un simple et directe de la solution pour le problème d'origine est d'utiliser le $(echo $'...') idiome:
Si vous utilisez un outil comme sed et de citer le délimiteur (EOF), les choses peuvent devenir plus simple:
\\t
dans votre doc ici, alors vous avez besoin d'une plus complexe sed invocation tels que:sed -e 's/\\t/\t/g' -e 's/\\\t/\\t/g'
.Utiliser @EOF et il permettra de préserver les onglets.