2016-07-02 2 views
0

In meinem/home/user Verzeichnis gibt es eindeutig eine .profile Datei. Innerhalb dieses Verzeichnisses kann ich den bash-Befehl ausführen, z. $bash run.sh. Aber in allen anderen Verzeichnissen, wenn der Eingang $bash, es klagt immer

bash: .profile: No such file or directory 

PS .: Ich brauche $bash in Nicht-Root-Verzeichnis laufen, weil ich eigentlich ein Python-Skript run.py haben, die diese Zeile subprocess.call(['bash', 'test.sh'], shell=True) enthält. Beim Ausführen dieses Python-Skripts beschwert sich bash über kein .profile.

Weiß jemand warum? Danke für die Hilfe!

+0

Was ist in der 'run.sh'? Versucht es, '.profile' direkt oder etwas zu liefern? – mgilson

+0

führen Sie das Python-Skript unter Root-Benutzer? – Hamlett

Antwort

1

Bitte versuchen Sie diese Lösung und lassen Sie mich wissen, wenn es funktioniert - da ich keinen Zugriff auf Ihr Skript und/oder Dateistruktur, und dieses Problem ist das einzige, das ich in den verfügbaren Informationen sehen kann, werde ich vorstellen dies als eine mögliche Antwort:

Dies kann aus der Teilung Ihrer Eingabe bei Verwendung der shell=True Argument führen. erfordert nicht hygienisiert Eingang, auch wenn dies ein Sicherheitsrisiko

subprocess.call('bash test.sh', shell=True) 

weil durch eine Shell-Ausführung: Nach der Dokumentation, müssen Sie den Befehl als solche verwendet werden.

Source

+0

Ihr vorgeschlagenes Skript hat funktioniert: subprocess.call ('bash test.sh', shell = True) Ich merke auch, dass mein ursprüngliches Skript auch funktioniert, wenn ich Shell = True loswerde: Aber warum konnte ich die Eingaben nicht teilen ? – leoking87

+0

@ leoking87 Ich bin froh, dass es funktioniert hat! Wenn Sie die Lösung als hilfreich gefunden haben, markieren Sie sie bitte für zukünftige Programmierer. Der Grund, warum Sie die Eingabe nicht teilen können (ich glaube), ist, dass bash Parts anders analysiert als Python. Ohne 'shell = True' muss python wissen, wo jeder Teil des Befehls beginnt und endet, bevor er ihn zusammenfügen und ausführen kann. Aber wenn Sie sagen, dass es nur bash verwenden soll, was seine eigenen Eingaben viel besser liest, müssen die Befehle nicht semantisiert werden - bash ist gut darin, seine eigenen Eingaben zu lesen. –

+0

@ leoking87 Ohne den Befehl 'shell = True' müssten Sie zum Beispiel keine Backslashes einfügen, um die Analyse von Leerzeichen zu vereinfachen. Python ist gut darin. Wenn Sie 'shell = True' enthalten und den Befehl erzwingen, ohne von Python zusammengespleißt zu werden, müssten Sie den ursprünglichen bash-Befehl ausführen, einschließlich Backslashes. Sie können dies selbst ausprobieren, indem Sie Backslashes verwenden, wenn 'shell = True' enthalten ist, und sie dann entfernen, wenn Sie' shell = True' nicht verwenden. –