O comando Python no bash não encontra o flag -c

1

Eu tenho duas linhas de python no meu script bash, ambas devem ser executadas com o sinalizador -c , mas quando eu executo o script Bash ele me diz que não foi possível encontrar -c sinalizador que é necessário para o python executar o comando no Bash. Ele funciona do comando como se eu copiasse o comando python para a linha de comando, ele executasse o comando, mas não de dentro do script.

Saída de erro:

mount.sh: 40: mount.sh: -c: not found

Meu script:

## define a function that launched the zenity username dialog
get_username(){
    zenity --entry --width=300 --title="Mount $MOUNTDIR" --text="Username:"
}
# define a function that launched the zenity password dialog
get_password(){
    zenity --entry --width=300 --title="Mount $MOUNTDIR" --text="Password:" --hide-text
}

# attempt to get the username and exit if cancel was pressed.
wUsername=$(get_username) || exit

# if the username is empty or matches only whitespace.
while [ "$(expr match "$wUsername" '.')" -lt "1" ]; do
    zenity --error --title="Error in username!" --text="Please check your username! Username field can not be empty!"  || exit
    wUsername=$(get_username) || exit
done

wPassword=$(get_password) || exit

while [ "$(expr match "$wPassword" '.')" -lt "1" ]; do
    zenity --error --title="Error in password!" --text="Please check your password! Password field can not be empty!" || exit
    wPassword=$(get_password) || exit
done

python -c 'import keyring; keyring.set_password("WinMount", wUsername, wPassword)'

Get_wPassword=python -c 'import keyring; keyring.get_password("WinMount", wUsername)'

# mount windows share to mountpoint
sudo mount -t cifs //$SERVER/$SHARE ${HOME}/${DIRNAME} -o username=${wUsername},password=$Get_wPassword,domain=${DOMAIN}
    
por mYzk 21.05.2014 / 15:44

3 respostas

4
Get_wPassword=python -c 'import keyring; keyring.get_password("WinMount", wUsername)'

provavelmente deveria ser

Get_wPassword=$(python -c 'import keyring; keyring.get_password("WinMount", wUsername)')

e se você quiser que wUsername seja dado pela variável shell com o mesmo nome

Get_wPassword=$(python -c "import keyring; keyring.get_password('WinMount', '$wUsername')")

(observe como as aspas duplas se tornaram simples e vice-versa)

    
por fkraiem 21.05.2014 / 15:56
4

É por causa dessa linha:

Get_wPassword=python -c 'import keyring; keyring.get_password("WinMount", wUsername)'

-c é interpretado como um comando. Escreva da seguinte forma:

Get_wPassword=$(python -c 'import keyring; keyring.get_password("WinMount", wUsername)')

EDIT: Para o problema com a variável bash. Você pode usar os.getenv para acessar variáveis de ambiente do Python:

export wUsername
export wPassword
Get_wPassword=$(python -c "import keyring; import os; \
keyring.get_password("WinMount", os.getenv('wUsername'))")
unset wPassword
    
por chaos 21.05.2014 / 15:58
2

A linha

Get_wPassword=python -c 'import keyring; keyring.get_password("WinMount", wUsername)'

significa "Executar -c com $ Get_wPassword definido como python "

Para definir apenas $Get_wPassword para o comando inteiro, use

Get_wPassword='python -c \'import keyring; keyring.get_password("WinMount", wUsername)\''
    
por Florian Diesch 21.05.2014 / 15:57