Depuração com programação shell e arquivos cpp?

0

Estou tendo problemas para entender como meu código está funcionando. Eu sou novo neste projeto e nunca aprendi unix antes. Meu colega de trabalho rapidamente me mostrou como executar o programa, mas não explicou como funcionava

Após certificar-se de que todos os arquivos C ++ foram compilados corretamente executando o make, ele foi ao prompt de comando e digitou ./run.sh list.txt

Eu dei uma olhada no arquivo run.sh . Está abaixo:

DIR=/directory/scripts/binaries/what

LIST=$1

while read PDF
do 
    echo "HOLD ON ${PDF}..." 
    ./makeInputAX.sh ${PDF} ${PDF} >INPUT/${PDF}.something 
    ${DIR} -AX INPUT/${PDF}.something # I don't want to reveal the actual types of files I'm dealing with, so I called them 'something'
done < ${LIST}

o arquivo makeInputAX.sh é:

$PDF=1
echo "THEFILE ABC/{PDF}.something"

e list.txt simplesmente contêm:

12345

Então, eu já sei que run.sh lê o que está dentro de list.txt e atribui 12345 para ser a variável LIST . Eu vejo HOLD ON 12345 no prompt de comando. O que me confunde é que achei que run.sh é executado primeiro e, em seguida, chama makeInputAX.sh . Como PDF pode ser atribuído a list.txt , quando essa atribuição estava em makeInputAX.sh não run.sh ?

O que também me confunde é que, no prompt de comando, vejo as saídas do programa, como elas foram escritas nos arquivos cpp que fazem parte do projeto. No entanto, esses arquivos estão em um diretório separado, não em /directory/scripts/binaries/what . Fiz alterações nesses arquivos cpp e quero ver as novas saídas que deveria receber, mas estou recebendo um erro:

 could not open the somethingelse file for read

No entanto, could not open the .. não está escrito em nenhum lugar no meu código C ++. Para corrigir isso, eu preciso procurar em meus arquivos cpp ou há algo para esses arquivos sh que podem ajudar?

    
por user4352158 18.12.2014 / 09:15

1 resposta

2

$1 é o primeiro argumento do script, por exemplo, list.txt

LIST=$1

simplesmente copia esse nome de arquivo para a variável LIST , então $LIST agora contém lists.txt também - ele não contém 12345 .

while read PDF
do
    ...
done < ${LIST}

inicia um loop cuja entrada padrão é redirecionada para o arquivo list.txt e, a cada vez, através do loop, ele lê uma linha do arquivo na variável PDF . Então $PDF conterá '12345.

As variáveis em makeInputAX.sh não estão relacionadas às variáveis em run.sh . Portanto, cada um deles tem suas próprias variáveis denominadas PDF e operam independentemente. A única exceção seria as variáveis de ambiente, que são declaradas usando o comando export ; variáveis de ambiente definidas em um script de chamada são copiadas para o ambiente dos scripts que chama (mas não o contrário).

Eu não vejo nada em seus scripts que poderia estar produzindo o "não foi possível abrir o arquivo somethingelse for read", ele deve ser proveniente do programa C ++. É possível que esteja em uma biblioteca que seu programa chama, para que você não veja a mensagem em nenhum lugar do seu código.

Seu script makeInputAX.sh não parece correto, no entanto. Provavelmente deveria ser algo assim:

PDF=1
echo "THEFILE ABC/${PDF}.something"

Você coloca $ antes de uma variável ao inserir seu valor em outro comando, você não a utiliza na atribuição. Você recuou, com o $ na atribuição, mas não no comando echo .

    
por 18.12.2014 / 17:25