1

If I paste these lines into a command prompt on Debian...

DIR=$(mktemp -d -t bbbrtc.XXXXXX) || exit 1
echo "tmpdir = $DIR"
cd "$DIR"

They make a new temp directory, print the directory name, and then pushd into that directory...

root@beaglebone:/tmp/bbbrtc.2mw02x# DIR=$(mktemp -d -t bbbrtc.XXXXXX) || exit 1
root@beaglebone:/tmp/bbbrtc.2mw02x# echo "tmpdir = $DIR"
tmpdir = /tmp/bbbrtc.Grti6K
root@beaglebone:/tmp/bbbrtc.2mw02x# pushd "$DIR"
/tmp/bbbrtc.Grti6K /tmp/bbbrtc.2mw02x ~/bbbphyfix
root@beaglebone:/tmp/bbbrtc.Grti6K# 

... as expected.

If I run the exact same commands from inside a shell script...

root@beaglebone:/tmp/bbbrtc.2mw02x# cat test.sh
#!/bin/sh

DIR=$(mktemp -d -t bbbrtc.XXXXXX) || exit 1
echo "tmpdir = $DIR"
pushd "$DIR"

root@beaglebone:/tmp/bbbrtc.2mw02x# ./test.sh
tmpdir = /tmp/bbbrtc.O6yYgf
./test.sh: 5: ./test.sh: pushd: not found
root@beaglebone:/tmp/bbbrtc.2mw02x#

...it generates the "pushd: not found" message.

Why do these commands not work from inside a shell script, and what it the proper way to have a script create a temp dir and then pushd into that new dir?

bigjosh
  • 589
  • 2
  • 6
  • 14

1 Answers1

3

pushd is a bash command, which is generally not implemented by /bin/sh. To use pushd in a sh script, you would have to provide a script or function with the same functionality.

The idiomatic way of temporarily changing one's working directory for the course of a few commands in a sh script is to do

( cd directory && somecommand )

This would change into directory and execute somecommand if that succeeded. The whole thing is done in a subshell, so the cd will not have any effect on the rest of the script.

Alternatively,

( cd directory || exit 1
  command1
  command2
  command3 )
Kusalananda
  • 320,670
  • 36
  • 633
  • 936