Почему в середине аргументов стоит EOF?

ldapmodify сообщает вам, что слово Defaultpolicy не является допустимым значением для элемента pwdPolicySubentry .

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

Вот пример значения:

pwdPolicySubentry: cn=Default Password Policy,cn=Password Policies,cn=config
20
18.02.2016, 18:53
5 ответов

Таблица в ответе на переполнение стека (который получил его из Bash Hackers Wiki ) объясняет, как расширяются различные переменные Bash:

Вы делаете python -i -c "from $ @" , который превращается в python -i -c "from sys" "import" "stdout" и -c принимает только один аргумент, поэтому он запускает команду из sys . Вы хотите использовать $ * , который будет заменен на python -i -c "from sys import stdout" (при условии, что $ IFS не установлен или начинается с пространство).

43
27.01.2020, 19:43

$ @ в двойных кавычках расширяется до списка элементов «$ 1» «$ 2» «$ 3» и т. Д.

#!/bin/bash
expand () {
    for string in "from $@" ; do
        echo "$string"
    done
}

expand sys import stdout

Python ожидает, что код будет в одном аргументе, а не в серии аргументов.

9
27.01.2020, 19:43

strace , как всегда, покажет, что происходит:

bash-4.1$ echo $$
3458

И в другом месте (или вы могли бы выяснить, как strace bash ... вызов функции):

bash-4.1$ strace -ff -o blah -p 3458

И обратно в эту первую оболочку:

bash-4.1$ from sys import stdout
  File "<string>", line 1
    from sys
           ^
SyntaxError: invalid syntax
>>> 
bash-4.1$ 

А затем обратно в оболочку strace :

Process 3458 attached
Process 25224 attached
^CProcess 3458 detached
bash-4.1$ grep exec blah.*
blah.25224:execve("/usr/bin/python", ["python", "-i", "-c", "from sys", "import", "stdout"], [/* 54 vars */]) = 0

Таким образом, фактический аргумент -c - -c "from sys" из-за того, как " $ @ " расширяется, или усеченная команда, на которую запускается python .

22
27.01.2020, 19:43

Strace действительно показывает, какие аргументы используются. Но самый простой способ увидеть, что обрабатывается, это добавить printf '<%s> ' перед каждой соответствующей строкой, и закрывающий echo (для генерации новой строки):

Таким образом, функция может быть изменена на такую:

from () {
    printf '<%s> ' "from $@"; echo
    printf '<%s> ' python3 -i -c "from $@"; echo
}

И при вызове:

$ from sys import stdout
<from sys> <import> <stdout> 
<python3> <-i> <-c> <from sys> <import> <stdout>

Ясно, что "from sys" посылается в python как один аргумент.
Это то, что получает python, и python действует на "from sys".

2
27.01.2020, 19:43

Python вызывается как

execve("/usr/bin/python", ["python", "-i", "-c", "from sys", "import", "stdout"], [/* 54 vars */])

(см. ответ трига ).

Чтобы $ @ раскрыть в виде одной строки (при условии разумного $ IFS ), вы можете использовать $ * внутри двойных кавычек: {{1 }}

python3 -i -c "from $*"

Подтверждено с помощью strace -e execve :

execve("/usr/bin/python", ["python", "-i", "-c", "from sys import stdout"], [/* 54 vars */]) = 0
6
27.01.2020, 19:43

Теги

Похожие вопросы