Estou interessado em escrever um script com o seguinte comportamento:
- Veja se existe um arquivo, build.xml, no diretório atual; em caso afirmativo, execute um comando fornecido por meio de argumentos ao script.
- Caso contrário, abra o diretório atual e observe o pai. Vá para 1.
O script terminaria assim que encontrássemos o arquivo ou alcançássemos a raiz. Além disso, quando o script terminar e o controle voltar para o usuário, quero que o diretório atual seja aquele onde o script foi inicialmente l
Não estou muito familiarizado com scripts de shell, mas qualquer ajuda/orientação será muito apreciada.
Responder1
No bash, você pode conseguir isso, por exemplo:
mkt.sh
curr=`pwd`
file_name=build.xml
echo "Current directory: $curr"
while [ "$curr" != "/" ]; do
echo "Processing: $curr"
file="$curr/$file_name"
if [ -f "$file" ]; then
echo "Found at: $file, running command..."
cd "$curr"
"$@"
exit
fi
curr="`dirname \"$curr\"`"
done
echo "$file_name not found."
Execução de amostra:
~$ cd /tmp
/tmp$ ls mkt.sh
mkt.sh
/tmp$ mkdir -p a/b/c/d
/tmp$ echo hello > a/build.xml
/tmp$ find a
a
a/build.xml
a/b
a/b/c
a/b/c/d
/tmp$ cd a/b/c/d
/tmp/a/b/c/d$ /tmp/mkt.sh cat build.xml
Current directory: /tmp/a/b/c/d
Processing: /tmp/a/b/c/d
Processing: /tmp/a/b/c
Processing: /tmp/a/b
Processing: /tmp/a
Found at: /tmp/a/build.xml, running command...
hello
/tmp/a/b/c/d$ rm /tmp/a/build.xml
/tmp/a/b/c/d$ r/tmp/mkt.sh cat build.xml
Current directory: /tmp/a/b/c/d
Processing: /tmp/a/b/c/d
Processing: /tmp/a/b/c
Processing: /tmp/a/b
Processing: /tmp/a
Processing: /tmp
build.xml not found.
Além disso, quando o script terminar e o controle voltar para o usuário, quero que o diretório atual seja aquele onde o script foi inicialmente l
Não há necessidade de fazer isso no bash. Os scripts filhos não podem alterar o pwd atual do processo bash pai. Experimente isto:
$ cd /tmp
$ echo "cd /usr" > a.sh
$ chmod u+x a.sh
$ pwd
/tmp
$ cat a.sh
cd /usr
$ ./a.sh
$ pwd
/tmp
Como você pode ver, o pwd atual não mudou, mesmo que o script tenha mudado cd /usr
dentro dele.