Я не думаю, что без привилегий root можно обойти эту ограниченную оболочку (и не следует ее использовать).
Из [1176619]man su[1176620]:
Если у целевого пользователя ограниченная оболочка (т.е. поле оболочки этого пользователя в /etc/passwd не указано в /etc/shells), то опция --shell или переменная окружения $SHELL не будут учитываться, если только su не вызывается root.
Это происходит потому, что set -x
отображает оценку расширений - что не является фактором для типичных перенаправлений.
LC_ALL=C man set |
sed -n '/^ *-x/,/^$/p'
-x The shell shall write to standard error a
trace for each command after it expands the
command and before it executes it. It is
unspecified whether the command that turns
tracing off is traced.
Из спецификации POSIX
Операторы перенаправления
<<
и<< -
позволяют перенаправлять строки, содержащиеся во входном файле оболочки, известном как здесь-документ для ввода команды.
Эти данные получает cat
, а не оболочка. Таким образом, нет расширения , о котором он мог бы сообщить перед выполнением. И после того, как он передал этот бит своего ввода, действительно нет данных, по которым он все равно мог бы сообщить.
Вот почему - как рекомендовано в другом месте set -v
действительно работает, тогда как -x
не работает:
LC_ALL=C man set |
sed -n '/^ *-v/,/^$/p'
-v The shell shall write its input to standard
error as it is read.
В этом случае он дублирует свой ввод в stderr
во время чтения - до перенаправления - независимо от того, расширяет он его или нет.
В оболочке нет функций, поддерживающих это. Вы можете достичь этого конкретного результата, выполнив
tee /test << "EOF"
a
b
c
d
EOF
, но это не так просто адаптировать ко всему, что вы могли бы сделать в сценарии оболочки.
Возможно, вы захотите изучить такие программы, как screen
и Expect
.