2017-04-12 3 views
1

Ich rufe ein Perl-Programm von einem Bash-Skript auf. Dieses Perl-Skript funktioniert, wenn ich seine Argumente über die Befehlszeile auszeichne, aber wenn ich es vom Bash-Skript aus anrufe, gibt es einen Fehler.

Hier ist der relevante Teil des Bash-Skript:

for ((i=1; i<=$z; i++)) 
do 
    if (($i%2 == 0)); then 
     ~/Desktop/SNP_finder.pl `awk 'FNR == '$i <"${d}".fasta` `awk ...` "${d}".txt 
    else 
... 

und das Skript Perl:

local $, = "\t"; 
my @read = split('', $ARGV[0]); 
my @reference = split('', $ARGV[1]); 
my $filename = $ARGV[2]; 
... 
open(my $fh, '>>', $filename) or die; 
print $fh "Reference ", "SNP ", "Location\n"; 
... 

I SNP_finder.pl fein aus dem Terminal-Fenster laufen kann, aber wenn ich eine Pipe an dieser Bash Skript gibt mir den Fehler Use of unitialized value $filename und behauptet, dass der Wert $filename'' ist.

+0

Bitte zeigen Sie alle im Skript verwendeten 'awk'-Befehle an. Wie führst du den Befehl aus dem Terminalfenster aus? –

+0

Ich weiß, dass die "awk" Empfehlungen gut sind, weil die Verrohrung gut funktioniert, ohne den Dateinamen hinzuzufügen. Aber sie sind: 'awk 'FNR ==' $ i <" $ {d} ". Fasta' und' awk 'FNR == 2' <"$ {d}". Fasta' – quantik

+0

Vielleicht könnte es sich lohnen Kopieren Sie Ihren '~/Desktop/SNP ...' Befehl, außer den Namen des 'perl' Programms in' echo' zu ändern, um zu sehen, was die 'awk' Befehle (und die Dateinamenerweiterung) in Ihrem Skript werden? Es scheint, dass, wenn es von der Befehlszeile aus arbeitet, aber nicht innerhalb des Skripts, etwas in der Umgebung des Skripts anders ist (irgendeine nicht initialisierte Variable oder eine andere Einstellung oder ein anderer Ort), die das Problem verursacht. Sie wissen, was Ihnen die 'awk'-Befehle in der Befehlszeile geben, aber was ist mit dem Skript? –

Antwort

3

Die Shell führt Worttrennung durch. Wenn Ihre awk-Skripts leer sind, wird der "${d}".txt-Parameter als $ARGV[1] oder $ARGV[0] enden. Wenn Ihre awk-Skripte einen String mit Leerzeichen zurückkehren, wird es weiter unten am Ende ...

dies zu vermeiden, sollten Sie sie zitieren, wie folgt aus:

"`awk ...`" 

Noch besser wäre:

"$(awk ...)" 
+0

Ich weiß, dass die 'awk'-Skripte nicht leer sind, weil es einwandfrei funktioniert, ohne den Dateinamen als Parameter an das Perl-Skript zu übergeben. Aber ich werde das versuchen. – quantik

+0

Hat nicht funktioniert. Ich glaube, es hat mit der Weitergabe der Textdatei als Argument zu tun, nicht mit den "awk" -Skripten. – quantik