Как передать аргумент с восклицательным знаком в Linux?

У меня есть простой скрипт Python, который получает имя пользователя и пароль в качестве аргументов, но мой пароль содержит два восклицательных знака. Когда я вызываю свой скрипт, например

salafek@dellboy:~/Desktop/$ emailsender.py -u username -p pass!!

команда, которую я ввел ранее, заменяет восклицательные знаки:

salafek@dellboy:~/Desktop/$emailsender.py -u username -p "passemailsender.py -u username -p passwget wget http://www.crobot.com.hr/templog"

Я могу избежать восклицательных знаков с помощью обратной косой черты (\), но мой пароль изменится.

Есть ли решение для этого, как я могу избежать восклицательных знаков, не меняя пароль?


person salafek    schedule 27.07.2010    source источник
comment
Вторая команда не имеет особого смысла, что вы там пытаетесь сделать?? Особенно часть passemailsender.py -u username -p passwget wget ...   -  person adamJLev    schedule 27.07.2010
comment
!! заменяется оболочкой, она заменяется последней выполненной командой. Это не относится к питону.   -  person Mad Scientist    schedule 27.07.2010
comment
@Infinity - Bash интерпретирует !! в качестве последней введенной вами команды. Таким образом, когда он вводит команду, не экранируя свой пароль с помощью одинарных кавычек или обратной косой черты, bash вставляет свою последнюю команду вместо !! был.   -  person Joe Kington    schedule 27.07.2010


Ответы (3)


Вы должны иметь возможность просто заключать вещи в одинарные кавычки в оболочке.

$ emailsender.py -u username -p 'pass!!'
person Joe Kington    schedule 27.07.2010

Вам нужно экранировать его с помощью \ или заключить в одинарные кавычки, иначе ваша оболочка интерпретирует его.

emailsender.py -u username -p pass\!\!

or

emailsender.py -u username -p 'pass!!'
person unbeli    schedule 27.07.2010
comment
просто для записи, экранирование работает нормально, если вы не цитируете аргумент дважды. В противном случае '\' будет записан в файл буквально. - person pr00thmatic; 13.06.2015

Как упоминалось другими, эта проблема не относится к Python, а вызвана тем, как вы передаете параметр пароля сценарию.

Вы захотите заключить строку пароля в одинарные кавычки, чтобы убедиться, что она передается сценарию точно так, как вы ее вводите, и не интерпретируется оболочкой.

Вы можете сделать это и для имени пользователя, если есть вероятность, что оно содержит восклицательный знак или другой специальный символ.

Например:

emailsender.py -u 'username' -p 'pass!!'
person Community    schedule 27.07.2010