2

I sometimes end up doing things like:

Example:

from ~/blah

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

using the destination dir 3 times in a row. Isn't there a way to turn these into a one-liner command?

terdon
  • 242,166
fduff
  • 5,035
  • 1
    You can refer something here: http://unix.stackexchange.com/questions/136599/run-two-commands-on-one-argument-without-scripting/136624#136624 – cuonglm Jul 17 '14 at 14:04
  • @Gnouc you should make it as an answer to this question – fduff Jul 17 '14 at 14:19

3 Answers3

3

You mean like this?

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

or

function mm() {
  local dir=$1
  if [ ! -z "$dir" ]
  then
    mkdir ~/${dir} && cp * ~/${dir} && cd ~/${dir}
  fi
}
Ulrich Dangel
  • 25,369
3

In bash, the argument to the last command you ran is saved as !$. This is documented in 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.

So, you could do

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

Or, simply

$ mkdir ~/test-tmp
$ cp * !$
$ cd !$
terdon
  • 242,166
2

If your concern includes the retyping of ~/test-tmp, you can do the following to shorten and combine the commands into a one-liner:

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

Please note that if your path includes spaces, you have to quote the assignment and where you use the variable:

D="~/test tmp"; mkdir "$D" ; cp * "$D"; cd "$D"
Anthon
  • 79,293
  • nice one! although the export isn't required in this case. – fduff Jul 17 '14 at 14:20
  • @fduff You are right. From my bash history I see I first tried A=1 echo $A , when that did not work (because of the missing semi-colon and echo being build-in), I both added the export and the semi-colon in the next try – Anthon Jul 17 '14 at 14:33