Если вы не возражаете что пользователь может выполнять произвольные команды, включая подстановку команд $ (…)
, вы можете передать строку во встроенную функцию eval
. Обратите внимание, что eval
ожидает фрагмент оболочки, и если входные данные содержат кавычки, они могут вызвать синтаксические ошибки. (Относительно) простой способ справиться с кавычками - использовать здесь документ для выполнения замен. Вы все еще зависите от незавершенной подстановки переменной или команды (например, $ (foo
).
IFS= read -r -p "Enter input: " input
eval "string=\$(cat <<EOF
_${input}
EOF
)"
string=${string#_}
Это связано с Linux:
Когда программа запускает другую, она должна использовать имя исполняемого файла в качестве параметра командной строки $0, но может поступить иначе. Поле Name
в /proc/PID/status
всегда устанавливается ядром на имя исполняемого файла (но усеченное до 15 символов).
Само приложение может изменить имя. Более длинное имя можно получить из /proc/PID/cmdline
(читать до первого нулевого байта).