Je voudrais construire une fonction courte pour faire ce qui suit. Disons que je déplace le fichier 'file.tex' dans mon répertoire de documents:
mv file.tex ~/Documents
Ensuite, je voudrais cd
à ce répertoire:
cd ~/Documents
Je voudrais généraliser cela à n'importe quel répertoire, afin de pouvoir le faire:
mv file.tex ~/Documents
follow
et demandez à la follow
commande de lire la destination de la commande précédente, puis exécutez-la en conséquence. Pour un répertoire simple, cela ne fait pas gagner beaucoup de temps, mais lorsque vous travaillez avec des répertoires imbriqués, il serait formidable de pouvoir simplement utiliser
mv file.tex ~/Documents/folder1/subfolder1
follow
Je pensais que ce serait relativement simple et que je pourrais faire quelque chose comme ça:
follow()
{
place=`history 2 | sed -n '1p;1q' | rev | cut -d ' ' -f1 | rev`
cd $place
}
mais cela ne semble pas fonctionner. Si je fais écho $place
, j'obtiens la chaîne souhaitée (je la teste ~/Documents
), mais la dernière commande retourne
No such file or directory
Le répertoire existe certainement. Je suis à perte. Pourrais-tu m'aider?
la source
file.tex
à l'emplacement d'origine, les liens symboliques sont une très bonne alternative, car vous ne devez créer un lien qu'une seule fois, puis il pointera toujours vers la dernière version.cd
alt +.
pour remplacer le dernier jeton de la commande précédente. Répétez pour remonter plus loin dans l'histoire des jetons finaux. (Je dis que le jeton n'est pas arg, car ilfoo &
s'empare&
du dernier jeton.) Vous pouvez utiliser un argument numérique (avec escape-3 alt +. Par exemple).Réponses:
Au lieu de définir une fonction, vous pouvez utiliser la variable
$_
, qui est développée jusqu'au dernier argument de la commande précédente parbash
. Alors utilisez:après
mv
commande.Vous pouvez également utiliser l'expansion de l'historique:
Si vous devez utiliser une fonction:
NB: Cette réponse est ciblée sur le format d'arguments de ligne de commande exact que vous avez utilisé car nous traitons des paramètres de position. Pour d'autres formats, par exemple
mv -t foo bar.txt
, vous devez incorporer des vérifications spécifiques au préalable, un wrapper serait alors approprié.la source
cd !$
oucd $(dirname !$)
. Ne connaissait pas la$_
variable!mv -t ~/Documents file.tex
au lieu demv file.tex ~/Documents
? En fin de compte, je ne suis pas sûr que cela soit résoluble dans le cas général ... une fonction wrapper autour ou que les réimplémentationsmv
pourraient être mieux ...!$
est équivalent!:$
et plus rapide à taper.Avec les raccourcis clavier bash standard, la combinaison Alt.copiera le dernier argument de la ligne de commande précédente dans celui en cours. Donc, en tapant
donnerait
et serait encore moins tapant que le mot
follow
.Pour plus de commodité, la répétition de la Alt.combinaison parcourra les derniers arguments de toutes les lignes de commande précédentes.
Addendum: le nom de la commande bash correspondant à cette combinaison de touches est
yank-last-arg
ouinsert-last-argument
. Il peut être trouvé dans la page de manuel bash sous "Commandes pour manipuler l'historique" ou dans le manuel de référence Bash plus exhaustif .)la source
<esc>
ensuite.
pour obtenir le même résultat que celui-ci<alt>+.
, utile lorsque vous avez remappé le verrou pour s'échapper :)Vous rencontrez presque certainement le problème que l'expansion du tilde a lieu avant l'expansion des paramètres, ce qui peut être expliqué par un exemple succinct:
Cela peut être résolu avec
eval
. Quoi qu'il en soit, vous allez avoir besoineval
, car vous tirez des commandes de l'historique et elles peuvent contenir des extensions arbitraires, comme:(Il y a des problèmes, tels que la ré-expansion de ces valeurs peut ne plus correspondre à l'expansion d'origine qui s'est produite. Supposons
compute_folder_name
qu'une fonction incrémente une variable globale.)la source
eval
. (Jamais.) Mais bon repérage des problèmes de séquence d'extension. Si vous mentionnez la plus grande opportunité d'expansion de l'histoire à utilisereval
ici, ce sera la meilleure réponse à mon avis; aucun des autres n'a expliqué pourquoi la solution de l'affiche originale n'a pas fonctionné.