'mktemp -d' seguido de 'pushd' funciona bem na linha de comando, mas não quando em um script

1

Se eu colar essas linhas em um prompt de comando no Debian ...

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

Eles criam um novo diretório temp, imprimem o nome do diretório e, em seguida, pushd nesse diretório ...

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# 

... como esperado.

Se eu executar exatamente os mesmos comandos de dentro de um script de shell ...

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#

... gera a mensagem "pushd: not found".

Por que esses comandos não funcionam dentro de um script de shell, e qual é a maneira correta de ter um script para criar um diretório temporário e, em seguida, pushd para esse novo diretório?

    
por bigjosh 28.05.2018 / 05:19

1 resposta

2

pushd é um comando bash , que geralmente não é implementado por /bin/sh . Para usar pushd em um script sh , você teria que fornecer um script ou função com a mesma funcionalidade.

A maneira idiomática de alterar temporariamente o diretório de trabalho de alguém para o curso de alguns comandos em um script sh é fazer

( cd directory && somecommand )

Isso mudaria para directory e executaria somecommand se isso fosse bem-sucedido. A coisa toda é feita em um subshell, então o cd não terá nenhum efeito no restante do script.

Alternativamente,

( cd directory || exit 1
  command1
  command2
  command3 )
    
por 28.05.2018 / 08:43