13

In Bash and similar shells cd - changes the current directory to a previously visited one. It's often very handy. I wonder if there is similar shorthand for copying or moving files, like:

~/project-a/ $ cd ../project-b
~/project-b/ $ cp Makefile LICENSE - # this won't work, hence the question

I'd be also happy with zsh specific answers.

  • 5
    With bash: Instead of - press Esc and then . to get from last command its last argument (here: ../project-b). – Cyrus Mar 31 at 15:06
  • That's true @Cyrus, but in the example the intention is to copy from project-b to project-a. – Tad Lispy Mar 31 at 15:19
  • @Cyrus, I was always aware that bash has some Emacs-like key bindings and am a heavy Emacs user myself. I was always happily using the general line movement keys of emacs on the shell (C-a etc.). But your comment prompted me to actually look for key bindings in man bash. Holy moly... it really is Emacs-like, complete with the kill ring, the mark semantics (C-space) etc. Thanks for bringing that up. – AnoE Apr 1 at 11:15
28

If your shell has cd -, then it will likely have either the special variable $OLDPWD and/or the shortcut ~- for the directory you've been in previously.

cp Makefile LICENSE "$OLDPWD/"

cp Makefile LICENSE ~-

cat ~-/Makefile

Indeed the POSIX shell language (upon which ksh/bash/zsh are built) specifies that cd - should be equal to cd "$OLDPWD".

5

You can always use shell backquotes.

They act like a subshell : the command in the backquotes is executed first, and its output is placed as argument of the main command.

~/folderA$ cd ../folderB  
~/folderB$ cp Makefile `cd -`  
# gets expended to "cp Makefile ~/folderA"
  • 4
    No, the command cd - outputs nothing, so `cd -` expands to the empty string. Try the command % echo `cd -` to verify. You would need to use something like % echo `cd -; pwd` ... – Neal Young Apr 1 at 0:21
  • 2
    @NealYoung: It seems that there’s something wrong with your shell. POSIX says “When a <hyphen-minus> is used as the operand [to cd], this shall be equivalent to the command: cd "$OLDPWD" && pwd, which changes to the previous working directory and then writes its name.” … (Cont’d) – G-Man Says 'Reinstate Monica' Apr 1 at 2:36
  • 1
    (Cont’d) …  And bash(1) says “An argument of - is converted to $OLDPWD before the directory change is attempted.  If a non-empty directory name from CDPATH is used, or if - is the first argument, and the directory change is successful, the absolute pathname of the new working directory is written to the standard output.” – G-Man Says 'Reinstate Monica' Apr 1 at 2:36
  • 1
    @Nathanael C.: But please use "$(cd -)". – G-Man Says 'Reinstate Monica' Apr 1 at 2:40
  • There's only "something wrong" if the shell claims POSIX compliance, and I think it's perfectly normal for shells that weren't invoked as /bin/sh and aren't specifically trying to emulate a POSIX shell to implement their language in whatever way they want... – grawity Apr 1 at 3:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.