Расширение Bash $ как команда

Процесс ответственен за управление его собственным текущим каталогом. Нет никакого способа изменить его с внешней стороны.

Можно обмануть путем делания изменения процесса его собственным каталогом. Если Вы работаете как корень, или как тот же пользователь как процесс, можно использовать ptrace системный вызов, чтобы сделать весь способ агрессивных вещей на процессе, включая изменение его памяти под его носом и выполнением системных вызовов. Это - то, что используют отладчики.

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

Вот сценарий, который я раньше в прошлом перемещал, процессы из подвешенного NFS монтируется. Используйте на Ваш собственный риск.

#!/bin/sh
if [ $# -ne 2 ]; then
  echo 1>&2 "Usage: $0 PID DIR"
  exit 120
fi
case "$1" in
  *[!0-9]*) echo 1>&2 "Invalid pid \`$1'"; exit 3;;
esac
case "$2" in
  *[\\\"]*)
    echo 1>&2 "Unsupported character in directory name, sorry."
    exit 3;;
esac

gdb -n -pid "$1" -batch -x /dev/stdin <

3
09.07.2013, 21:14
2 ответа

Это из-за расширения тильды. Оценка разворачивает тильду, которая заменяется полным путем к корневому каталогу. Без него команда передала литеральную тильду и пытается использовать относительный путь (который не существует).

$ echo ~
/home/chris
$ echo "~" 
~
$ eval 'echo ~' 
/home/chris 
3
27.01.2020, 21:23
  • 1
    Не Сделал Вы имеете в виду eval 'echo ~' или eval "echo ~"? Или даже eval echo "~"? Как введено, это произведет вывод ~ –  rici 09.07.2013, 21:21
  • 2
    , который я вижу и ошибка, сообщает о полном пути! Не на самом деле команда, выполняемая просто артефакт в сообщении об ошибке. Я должен вырыть больше в расширение и почему оно расширяется в оценке не на –  MageProspero 09.07.2013, 22:04
  • 3
    @rici Благодарит, мое плохое, я вводил это из своего телефона. –  Chris Down 10.07.2013, 06:37

Вам нужны кавычки: "${cmd[@]}"

Без кавычек все элементы массива являются smushed в единственную строку. С кавычками каждый элемент будет правильно обработан индивидуально.

Из руководства:

Если нижний индекс ‘@’ или ‘*’, слово расширяется до всех членов имени массива. Эти нижние индексы отличаются только, когда слово появляется в двойных кавычках. Если слово дважды заключается в кавычки, [...] ${name[@]} разворачивает каждый элемент имени к отдельному слову.

0
27.01.2020, 21:23
  • 1
    Корректный, но это не то, о чем вопрос. –  Gilles 'SO- stop being evil' 09.07.2013, 23:42

Теги

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