web-dev-qa-db-fra.com

Python dans bash ne trouve pas l'indicateur -c

J'ai deux lignes python dans mon script bash, les deux devraient s'exécuter avec l'indicateur - c, mais une fois que j'exécute le script Bash, il me dit qu'il n'a pas pu trouver - - c indicateur nécessaire pour python pour exécuter la commande dans Bash. Cela fonctionne à partir de la commande comme si je copiais le python commande à la ligne de commande, il exécute la commande, mais pas à l'intérieur du script.

Sortie d'erreur:

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

Mon 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}
1
mYzk
Get_wPassword=python -c 'import keyring; keyring.get_password("WinMount", wUsername)'

devrait probablement être

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

et si vous voulez que wUsername soit donné par la variable Shell du même nom

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

(notez comment les guillemets sont devenus simples et vice versa)

4
fkraiem

C'est à cause de cette ligne:

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

-c est interprété comme une commande. Écrivez-le comme suit:

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

EDIT: Pour le problème avec la variable bash. Vous pouvez utiliser os.getenv pour accéder aux variables d'environnement depuis Python:

export wUsername
export wPassword
Get_wPassword=$(python -c "import keyring; import os; \
keyring.get_password("WinMount", os.getenv('wUsername'))")
unset wPassword
4
chaos

La ligne

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

signifie "Exécuter -c avec $ Get_wPassword défini sur python "

Pour définir simplement $Get_wPassword à l'ensemble de la commande

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