Como obter 'pwd' no script de shell que foi iniciado por outro script de shell [duplicado]

0

startScript.sh está em /root/script/startScript.sh

script1.sh está em /root/script/test/script1.sh

script2.sh está em /root/script/test/script2.sh

startScript.sh parece com abaixo

#!/bin/bash
#some code!
sh 'pwd'/test/script1.sh 2>&1 &
sh 'pwd'/test/script2.sh 2>&1 &
#some code

script2.sh e script1.sh se parecem com

#!/bin/bash
> 'pwd'/process_ids.txt
while true;do
  echo "The Process: 'ps'" >> 'pwd'/process_ids.txt
  #some code to parse the process, etc. and echo it
done

Aqui está a coisa, o arquivo process_ids.txt está criando em /root/script . Mas de acordo com scriptx.sh , o pwd é /root/scripts/test/ . Eu mostrei o pwd em scriptx.sh , ele está mostrando /root/script/ . Como posso obter o pwd de scriptx.sh ?

    
por Veerendra 26.11.2015 / 13:43

3 respostas

1

Por que você não adiciona apenas test/ ao caminho do arquivo que está tentando criar, ou seja,

#!/bin/bash
> 'pwd'/test/process_ids.txt
while true;do
  echo "The Process: 'ps'" >> 'pwd'/test/process_ids.txt
  #some code to parse the process, etc. and echo it
done
    
por 26.11.2015 / 14:08
0

A abordagem mais simples é passá-lo como um parâmetro para os scripts 1 e 2. Assim, modifique scriptx.sh para (a propósito, use $PWD , não há razão para executar um comando externo):

#!/bin/bash
#some code!
sh "$PWD"/test/script1.sh "$PWD" 2>&1 &
sh "$PWD"/test/script2.sh "$PWD" 2>&1 &
#some code

E script1.sh e script2.sh para:

#!/bin/bash

dir="$1"
> "$dir"/process_ids.txt
while true;do
  echo "The Process: 'ps'" >> "$dir"/process_ids.txt
  #some code to parse the process, etc. and echo it
done

A abordagem mais complexa é obter o PWD do script pai do sistema de arquivos /proc . Como scriptx.sh está lançando os outros, eles terão acesso ao PID de scriptx.sh na variável $PPID . No Linux, cada processo em execução possui um link para seu diretório de trabalho atual em /proc/PID/cwd . Portanto, você pode deixar scriptx.sh inalterado e modificar os outros para:

#!/bin/bash

dir="$(readlink -f /proc/$PPID/cwd)"
> "$dir"/process_ids.txt
while true;do
  echo "The Process: 'ps'" >> "$dir"/process_ids.txt
  #some code to parse the process, etc. and echo it
done
    
por 26.11.2015 / 13:50
0

você não precisa receber ou passar qualquer coisa. isso já está feito. o diretório de trabalho atual de um processo bifurcado é o diretório de trabalho atual do processo pai. Portanto, a menos que esses scripts estejam alterando seu diretório atual e, se forem, é um comportamento intencional ou algo que você deve impedi-los de fazer com uma edição, o diretório de trabalho atual é o mesmo para todos. mas se houver diferença por algum motivo, então a saída de ...

'pwd'

... seria igualmente problemático e exatamente pelas mesmas razões, e portanto não poderia ser considerado como uma indicação de uma forma ou de outra.

ainda, se você quisesse verificar essas coisas para outro processo, e você tinha o PID do outro processo - como você faz para script2.sh no parâmetro shell $! e que você pode obter para o outro com jobs -p , então, em um sistema linux, você poderia fazer:

cd -P /proc/"$!"/cwd;pwd;cd -

... que primeiro mudará para o diretório de trabalho atual do último processo em segundo plano, depois o imprimirá, depois voltará ao diretório de trabalho atual anterior do shell atual e o imprimirá.

    
por 26.11.2015 / 14:22