Buscando una forma de convertir múltiples commands con el mismo parámetro en un solo trazador de líneas

A veces termino haciendo cosas como:

Ejemplo :

de ~/blah

 $ mkdir ~/test-tmp $ cp * ~/test-tmp $ cd ~/test-tmp 

utilizando el directory de destino 3 veces seguidas. ¿No hay una manera de convertir estos en un command de una sola línea?

¿Quieres decir así?

mkdir ~/test-tmp && cp * ~/test-tmp && cd ~/test-tmp

o

 function mm() { local dir=$1 if [ ! -z "$dir" ] then mkdir ~/${dir} && cp * ~/${dir} && cd ~/${dir} fi } 

Si su preocupación incluye la reescritura de ~/test-tmp , puede hacer lo siguiente para acortar y combinar los commands en un único liner:

 D=~/test-tmp; mkdir $D; cp * $D; cd $D 

Tenga en count que si su ruta incluye espacios, debe citar la asignación y dónde utiliza la variable:

 D="~/test tmp"; mkdir "$D" ; cp * "$D"; cd "$D" 

En bash, el argumento para el último command que ejecutó se guarda como !$ . Esto está documentado en man bash :

  ! Start a history substitution, except when followed by a blank, newline, carriage return, = or ( (when the extglob shell option is enabled using the shopt builtin). [...] $ The last argument. 

Entonces, podrías hacer

 $ mkdir ~/test-tmp ; cp * !$ ; cd !$ 

O simplemente

 $ mkdir ~/test-tmp $ cp * !$ $ cd !$