Me gustaría construir una función corta para hacer lo siguiente. Digamos que muevo el archivo 'file.tex' a mi directorio de documentos:
mv file.tex ~/Documents
Entonces, me gustaría ir cd
a ese directorio:
cd ~/Documents
Me gustaría generalizar esto a cualquier directorio, para poder hacer esto:
mv file.tex ~/Documents
follow
y haga que el follow
comando lea el destino del comando anterior, luego ejecútelo en consecuencia. Para un directorio simple, esto no ahorra mucho tiempo, pero cuando se trabaja con directorios anidados, sería tremendo poder usar
mv file.tex ~/Documents/folder1/subfolder1
follow
Pensé que sería relativamente simple y que podría hacer algo como esto:
follow()
{
place=`history 2 | sed -n '1p;1q' | rev | cut -d ' ' -f1 | rev`
cd $place
}
Pero esto no parece funcionar. Si hago eco $place
, obtengo la cadena deseada (la estoy probando ~/Documents
), pero el último comando devuelve
No such file or directory
El directorio ciertamente existe. Estoy perdido ¿Podrías ayudarme?
fuente
file.tex
la ubicación original, los enlaces simbólicos son una muy buena alternativa, ya que solo tiene que vincular una vez, y siempre apuntará a la última versión.cd
alt +.
para sustituir el último token del comando anterior. Repita para ir más atrás en la historia de los tokens finales. (Digo token no arg, porquefoo &
toma&
como token final). Puedes usar un argumento numérico (con escape-3 alt +. Por ejemplo).Respuestas:
En lugar de definir una función, puede usar la variable
$_
, que se expande al último argumento del comando anterior mediantebash
. Entonces usa:después del
mv
comandoTambién puedes usar la expansión del historial:
Si debe usar una función:
NB: Esta respuesta está dirigida al formato exacto de argumentos de línea de comando que ha utilizado, ya que estamos tratando con parámetros posicionales. Para otros formatos
mv -t foo bar.txt
, por ejemplo , es necesario incorporar comprobaciones específicas de antemano, entonces sería apropiado un contenedor.fuente
cd !$
ocd $(dirname !$)
. ¡No sabía sobre la$_
variable!mv -t ~/Documents file.tex
lugar demv file.tex ~/Documents
? En pocas palabras, no estoy seguro de que esto semv
pueda resolver en el caso general ... una función envolvente o que los reimplementos podrían ser mejores ...!$
es equivalente!:$
y más rápido de escribir.Con las combinaciones de teclas bash estándar, la combinación Alt.copiará el último argumento de la línea de comando anterior en el actual. Entonces, escribiendo
cedería
y sería incluso menos tipeado que la palabra
follow
.Para mayor conveniencia, la repetición de la Alt.combinación buscará los últimos argumentos de todas las líneas de comando anteriores.
Anexo: El nombre del comando bash correspondiente a esta combinación de teclas es
yank-last-arg
oinsert-last-argument
. Se puede encontrar en la página de manual de bash en "Comandos para manipular el historial" o en el Manual de referencia de Bash más exhaustivo ).fuente
<esc>
a continuación.
para obtener el mismo resultado que<alt>+.
, esto, tiene utilidad cuando se tiene BloqMayus reasigna a escapar :)Es casi seguro que se encuentra con el problema de que la expansión de tilde tiene lugar antes de la expansión de parámetros, lo que puede explicarse con un breve ejemplo:
Esto se puede abordar con
eval
. De todos modos, vas a necesitareval
, porque estás extrayendo comandos del historial y pueden contener expansiones arbitrarias, como:(Hay problemas, como que la reexpansión de estos valores puede que ya no coincida con la expansión original que se produjo. Supongamos que
compute_folder_name
es una función que incrementa alguna variable global).fuente
eval
. (Nunca.) Pero es bueno detectar los problemas de la secuencia de expansión. Si menciona la mayor conveniencia de la expansión de la historia para usareval
aquí, esta será la mejor respuesta en mi opinión; ninguno de los otros explica realmente por qué la solución del Cartel original no funcionó.