К сожалению, вам нужно исправить код, который запускает ваш скрипт - переменная name
уже повреждена до запуска скрипта, потому что оболочка, которую вызывает su
, заменяет $_jghd
пустой строкой перед вызывается явный сценарий sh -x
.
Для создания кода, содержащего данные, используйте printf %q
, как указано ниже:
#!/usr/bin/env bash
value='obj$_jghd$:jhdbcdj:hshabsh'
printf -v cmd '%q ' sh -x myscript.sh arg1 arg2 arg3 "$value"
su - oracle -c "cd /tmp/somepath && $cmd"
Обратите внимание на использование bash, not sh
, поскольку printf %q
отсутствует в базовых оболочках POSIX, и, кроме того, не гарантируется генерация POSIX-совместимого вывода. (Следовательно, для обеспечения надежности всех возможных значений пользователь oracle
должен быть настроен с bash
в качестве оболочки).
В качестве альтернативы, вы можете передавать значения через среду:
#!/bin/sh
value='obj$_jghd$:jhdbcdj:hshabsh'
value="$value" su - oracle -c 'cd /tmp/somepath && ./myscript.sh arg1 arg2 arg3 "$value"'
Переназначение value
в той же строке, что и su
, помещает его в окружение su
, которое затем наследуется оболочкой, впоследствии расширяющейся $value
.