2013-03-16 5 views
7

Ich frage mich, ob subprocess.call("if [ ! -d '{output}' ]; then mkdir -p {output}; fi",shell=True) von sh oder zsh anstelle von bash in verschiedenen Server interpretiert werden?Ist `shell` in` shell = True` im Subprozess `bash`?

Hat jemand Ideen dazu?

Was soll ich tun, um sicherzustellen, dass es von bash interpretiert wird?

+0

Es bedeutet - den Standard-Shell verwenden - was auch immer das Standard ist –

+0

@ JonClements Danke, Jon! Aber was sollte ich tun, um sicherzustellen, dass es von bash interpretiert wird? –

+1

@Firegun Rufen Sie '/ usr/bin/env bash' auf und geben Sie Ihre Befehle als Eingabe ein. – millimoose

Antwort

22

http://docs.python.org/2/library/subprocess.html

On Unix with shell=True, the shell defaults to /bin/sh 

Beachten Sie, dass/bin/sh oft etwas anderes Symlink, z.B. auf ubuntu:

$ ls -la /bin/sh 
lrwxrwxrwx 1 root root 4 Mar 29 2012 /bin/sh -> dash 

können Sie die executable Argument verwenden den Standard zu ersetzen:

... Wenn Shell = True, auf Unix das ausführbare Argument gibt einen Ersatzschale für den default/bin/sh.

subprocess.call("if [ ! -d '{output}' ]; then mkdir -p {output}; fi", 
       shell=True, 
       executable="/bin/bash") 
3

Sie können explizit die Schale Ihrer Wahl aufrufen, aber für den Beispiel-Code geschrieben Sie dies nicht der beste Ansatz ist. Schreiben Sie stattdessen den Code direkt in Python. Siehe hier: mkdir -p functionality in Python

3

der Shell angeben, use the executable parameter mit shell=True:

Wenn shell = True, auf Unix die ausführbare Argument eine Shell Ersatz gibt für den Standard/bin/sh.

In [26]: subprocess.call("if [ ! -d '{output}' ]; then mkdir -p {output}; fi", shell=True, executable='/bin/bash') 
Out[26]: 0 

Offensichtlich ist die ausführbaren Parameter mit sauberen, aber es ist auch möglich, bash als sh zu nennen:

In [27]: subprocess.call('''bash -c "if [ ! -d '{output}' ]; then mkdir -p {output}; fi"''', shell=True) 
Out[27]: 0