2016-12-22 10 views
-1

同じフォルダに別のスクリプトを呼び出すbashスクリプトを作成しました。私はそれが正常に働いていたと思ったが、私は他の理由のためのスクリプトをデバッグするために持っていたし、私はそれが2番目のスクリプトを追加していなかったが分かっただけで、メインスクリプトでbashに別のスクリプトを追加できません

#awk '{print $2}' >> /tmp/lista_pacotes.log adiciona resultado ao arquivo /tmp/tmp_pacotes_adicionados.log 
echo "\nPacotes adicionados até" $(date) "\n" >> /tmp/tmp_pacotes_adicionados.log 

cat /tmp/diferencas.log >> /tmp/tmp_pacotes_adicionados.log 

./email_pacotes.sh 

#adiciona resultados anteriores 
cat /tmp/pacotes_adicionados.log >> /tmp/tmp_pacotes_adicionados.log 

./email_pacotes.shを置くことによって、これをやっています初めてメインスクリプトを実行します。

私は、次のようなメッセージを得ていた。

[...] 
./email_pacotes.sh: 17: ./email_pacotes.sh: [[: not found 
./email_pacotes.sh: 17: ./email_pacotes.sh: [[: not found 
./email_pacotes.sh: 17: ./email_pacotes.sh: [[: not found 
./email_pacotes.sh: 17: ./email_pacotes.sh: [[: not found 
./email_pacotes.sh: 17: ./email_pacotes.sh: [[: not found 
[...] 

私は、スクリプト私は、フォルダに入れて初めて実行したときにこれが起こります。私がもう一度それを実行すると、メッセージはもはや表示されないので、私はそれが構文の問題ではないと推測します。私もパーミッションのあるものだと思っていましたが、両方のスクリプトを0777に変更してもメッセージはそのままです。

これは正常な動作ですか?これを引き起こす原因は何ですか?

Obs1:-xオプションを使用してメインスクリプトをデバッグしています。

Obs2:もう一度テストを行いました。それは同じメッセージを投げつけ続けますが、ある時点で最終的にスクリプトを呼び出します。だから、たぶん、ファイルを見つけたり、例外をスローする時間ですか?

+1

条件付きで最初に実行されない構文がありますか?あなたがスクリプトの関連部分を投稿していないかどうかは言うことができません。 –

+0

@martinclaytonスクリプトは本当に大きいですが、全く条件がありません。このコマンドは、何にもまったく関係ありません。 – EGS

+2

潜在的な回答者が文脈で少なくとも17行目を見ることができるように、行12-22と投稿を抽出することを提案します。 –

答えて

1

エラーから、私はあなたがbash以外のシェルで2番目のスクリプトを実行していることを確信しています。 [[ ]]条件はbash(とzshと他のシェルかもしれません)によってサポートされていますが、標準ではなく、サポートしていない他のシェルもあります。したがって、その(または他の非標準的なbash機能を)使いたい場合は、そのスクリプトで適切なシバン行を使用する必要があります。一般的に、それは#!/bin/bash(または多分#!/usr/bin/env bash)、#!/bin/shとスクリプトを開始する必要があることを意味します。

私には別の問題があります。 ./email_pacotes.shで2番目のスクリプトを実行すると、現在の作業ディレクトリでそのスクリプトが検索されます。このディレクトリは、最初のスクリプトを実行したプロセスから継承されています。最初のスクリプトがあるのと同じディレクトリにある2番目のスクリプトを探したい場合は、"$(dirname "$BASH_SOURCE")"のようなもので最初のスクリプトを見つけるのが最も良い方法です(そして、BASH_SOURCEはbashのみの機能なので、 bashシバンを使った最初のスクリプト)。そして、あなたは明示的なパスで2番目のスクリプト(および他の関連ファイル)を参照することができ、次のいずれか

#!/bin/bash 
... 
scriptDir="$(dirname "$BASH_SOURCE")" 
if [[ ! -d "$scriptDir" ]]; then 
    echo "Something's terribly wrong; I can't find myself!" >&2 
    exit 1 
fi 
... 
"$scriptDir/email_pacotes.sh" 

または独自のディレクトリにスクリプトcdを持って、その後、相対パスを使用します。

#!/bin/bash 
... 
cd "$(dirname "$BASH_SOURCE")" || { 
    echo "Something's terribly wrong; I can't cd to my own directory!" >&2 
    exit 1 
} 
... 
./email_pacotes.sh 

Iスクリプトのいずれかが(例えば引数として)パスを受け入れるならば、スクリプト自身がどこであるかに関係なく、ユーザがスクリプトを実行したときの相対パスで解釈されることを期待するでしょう。スクリプト内でcdを実行すると、これが破損します。

+0

私はbashを使用しています。私は#!/ bin/bashで始めました。私が言ったように、スクリプトは非常に大きいので、私はそれを完全に投稿しませんでした。私はあなたが言及した最初のアプローチを試みるつもりです。 – EGS

+0

@EGS 2番目のスクリプトが見つからないということは、表示されているエラーメッセージを表示してはいけません。別のディレクトリにemail_pacotes.shという名前の*別のスクリプトがありません。その代わりに1つ。これは時には時にはうまく動作しない理由を説明するかもしれません。ある時点でスクリプトが入っているディレクトリに移動し、突然2番目のスクリプトの正しいバージョンを探しています。 –

関連する問題