Não é possível passar uma variável bash como um argumento python no bash

3

Por algum motivo, não posso passar a variável bash $FOLDER como um argumento python no código a seguir. O script python faz o download de alguns arquivos do amazon s3.

Script de bash:

#!/bin/bash
FOLDER=$(./aws get $BUCKET"/location.txt")
python /data/pythonscript.py $FOLDER
#

A saída do $FOLDER é uma data regenerada, por exemplo. 2014/07/31/14-16-34 , usado como caminho.

Aqui está o script python:

#!/usr/bin/python

import boto, sys
from boto.s3.connection import S3Connection

access_key = 'accesskey'
secret_key = 'secretkey'
bucket_name = 'a name'
folder_path =  str(sys.argv[1]) if len(sys.argv) > 1 else ''

print("Forwarded folder path " + folder_path)

conn = S3Connection(access_key, secret_key)
bucket = conn.get_bucket(bucket_name)

print("Bucket Location:" + bucket.get_location())

for key in bucket.list(prefix=folder_path, delimiter=''):
        if '.' in key.name:
                file_name = key.name[len(folder_path)+1:]
                print("Downloading file " + file_name)
                key.get_contents_to_filename('/data/temp/' + file_name)

Quando executo o script bash sem alterar a linha python /data/pythonscript.py $FOLDER , recebo a seguinte saída:

Forwarded folder path 2014/07/31/14-16-34 
Buckect Location: 

Mas quando eu mudo para python /data/pythonscript.py 2014/07/31/14-16-34 , tudo funciona:

Forwarded folder path 2014/07/31/14-16-34
Bucket Location: 
Downloading 2014/07/31/14-16-34/FacetedSearch.zip 
Downloading file FacetedSearch.zip
Downloading 2014/07/31/14-16-34/Location.zip
Downloading file Location.zip
Downloading 2014/07/31/14-16-34/LocationPage.zip
Downloading file LocationPage.zip
    
por Bris 31.07.2014 / 16:15

2 respostas

7

Talvez o comando aws bash esteja retornando caracteres não imprimíveis que você não vê com print() . Tente removê-los com tr :

FOLDER=$(./aws get $BUCKET"/location.txt" | tr -cd "[:print:]")
    
por 31.07.2014 / 18:46
1

Tente colocar $FOLDER entre aspas duplas:

python script.py "$FOLDER"

Altere a primeira linha do seu script para

#!/usr/bin/env python

Isso deve funcionar.

E seja mais claro em suas perguntas.

Como @drs disse que sua pergunta ainda está incompleta:

  • Seus exemplos ainda são vagos e com falhas, como qual é o nome correto do seu script, é pythonscript ou s3download ?
  • É "trabalho como esperado" deveria ter um valor em branco para bucket.get_location() ?
por 31.07.2014 / 17:41