7
votes

Bash se référer à des arguments antérieurs dans la même ligne

Je semble vous rappeler que bash avait un raccourci Bang pour faire référence à quelque chose dans la même ligne. Je sais et utilise ! $ , !! et amis régulièrement. Je me souviens de la lecture de pouvoir faire quelque chose comme ce qui suit: xxx

! _ représente la combinaison que je ne me souviens pas. (L'objectif de ce qui précède est de créer un répertoire et immédiatement CD sur le succès.) Google ne donne que des republies des 2 mêmes tables de référence qui n'ont pas cette combinaison. < p> En ce moment, j'utilise le moins efficace xxx

qui obtient le travail fait mais pas comme je veux le faire.

< fort> Est-ce que quelqu'un connaît ce raccourci insaisissable?

Si cela importe, j'utilise zsh avec oh-my-zsh , pas vanille bash .


0 commentaires

4 Réponses :


7
votes
mkdir tmp && cd "$_"
is what you're looking for, I believe (you can drop the double quotes if you're sure that quoting is not needed).$_ expands differently in different contexts, but the one that matters here (from man bash , v3.2.51):
  expands  to  the last argument to the previous command, after expansion.
Background:Note: the following discusses bash, but it seems to apply to zsh in principle as well.$_ is a so-called special parameter, which you'll find listed among others (without the $ prefix) in the Special Parameters section of man bash:
Works both in interactive shells and in scripts.
Works at the individual command level, not at the line level.
By contrast, !-prefixed tokens (such as !$ to recall the most recent line's last token) relate to the shell's [command] history expansion (section HISTORY EXPANSION of man bash):
By default they work only in interactive shells, but that can be changed with set -o history and set -o histexpand (thanks, @chepner)).
Work at the line level (more accurately: everything that was submitted with one Enter keystroke, no matter how many individual commands or lines it comprised).

0 commentaires

1
votes

Qu'en est-il de cela:

mkdir foo; cd $_


0 commentaires

7
votes

! # fait référence à la ligne de commande jusqu'à présent, et vous pouvez extraire des mots spécifiques de celui-ci: xxx

la même syntaxe fonctionne dans zsh < / code> aussi.


4 commentaires

Fonctionne bien dans l'affaire à portée de main, mais le 1 dans ! #: 1 est un index absolu de jeton absolu du début du début de la ligne , ce qui signifie que la solution ne généralise pas bien; E.g., mkdir -p TMP / SUB && CD! #: 1 serait casser; Vous devriez faire attention et compter toutes les jetons sur la ligne pour trouver le bon indice. De plus, depuis la coquille développe la référence historique et stocke la commande développée dans l'historique (en plus de l'imprimer avant d'exécuter), vous ne pouvez pas revenir en arrière et éditer la commande comme dactylographié - par exemple, pour créer un autre dir. - Vous obtiendriez seulement la version développée . (suite ci-dessous).


(suite d'une ci-dessus) à condition que l'intention consiste à obtenir le last jeton (développé) (sinon, alors le ! # Solution-Based est nécessaire): tous ces problèmes s'éloignent lorsque vous utilisez $ _ , par exemple MKDIR -P TMP / SUB && CD "$ _" (i cendu double coté $ _ , pour être sûr). Je sais que l'OP cherchait un jeton d'expansion d'histoire, que vous avez fourni, mais étant donné la question intention , je pense $ _ est le meilleur choix.


Il y a une option shell ( histverify ) qui vous permet de modifier la commande avant de l'exécuter. € _ seulement fonctionne si l'intention est d'utiliser le dernier argument. ! # peut nécessiter un peu plus de travail, mais peut fonctionner avec n'importe quelle ligne de commande que vous pourriez utiliser.


C'est un bon résumé, merci; Je ne savais pas sur shopt -s histverify - Handy (pour Bash; équivalent ZSH: setopt hist_verify ). (Et, juste pour être clair: j'ai appris de votre message et de vos commentaires sur les miens.)



1
votes

(vieille nouvelle, mais si quelqu'un d'autre atterrit ici, comme je l'ai juste fait)


op semblait rechercher ! # [x] [- y] Syntaxe ZSH

où X et Y sont des index des mots de shell dans l'événement d'historique pour la ligne de courant

x et y sont supposés se référer au début ou à la fin de la ligne - respectivement - lorsque omis

(garder à l'esprit que la fin de la ligne dans ce contexte est en réalité la survenue du ! # [x] [- y] appel d'événement dans la ligne)

Cela nous donne les variantes suivantes:

  • ! # ligne actuelle jusqu'à ! #

  • ! # - y ligne actuelle up the y -Tème mot

  • ! # x x -ème mot uniquement

  • ! # x-y mots x via y

  • ! # x - à partir de x -ème mot, jusqu'à ! # x - < / p>

    en réponse directe à l'exemple donné: xxx

    ou, en prenant une étape supplémentaire: xxx < P> Le chemin / tmp / $ {pwd: t} serait créé également et agissez comme une alternative à CD à si pour une raison quelconque ./ TMP < / code> n'a pas pu être créé (qui aurait échoué silencieusement)

    Ceci suppose que l'utilisateur peut mkdir dans / tmp et est prêt à laisser des inutiles Les chemins sont générés (et laissés intacts) lorsque ./ TMP est parfaitement utilisable et choisi en fait

    problème potentiel se pose lorsque / TMP / $ {$ {PWD: T} < / code> existe déjà et son contenu ne sont pas liés et ne pas être perturbé, d'où le pwd; ls

    aliasing aide aux cas d'utilisation tels que Somecommand; mktmpd où normalement le! # 2-3 ne ferait plus référence aux paramètres appropriés TMP / tmp / $ {pwd: t} < P> Notez cependant que je ne préconise pas décidément que cette affaire d'utilisation est particulièrement utile (voire sa condition physique comme exemple, vraiment - mais je voulais souligner la particularité de l'alias depuis que je n'ai pas encore vu cela mentionné ailleurs) < / p>


0 commentaires