Можно выполнить загрузчик непосредственно и передать его команда, которую Вы хотите выполнить:
/lib/ld-linux.so /bin/chmod +x /bin/chmod
Ваш путь к загрузчику мог бы варьироваться. В 64-разрядной системе необходимо выбрать правильную на основе как chmod
был скомпилирован; 64-разрядную версию называют чем-то как /lib64/ld-linux-x86-64.so.2
user1@mac1:~/tmp$ cat t1.sh
exec 4>shell.log
BASH_XTRACEFD=4
set -x
echo abc
cat ffff
user1@mac1:~/tmp$ bash t1.sh
abc
cat: ffff: No such file or directory
user1@mac1:~/tmp$ cat shell.log
+ echo abc
+ cat ffff
user1@mac1:~/tmp$
Вывод set -x
направляется на stderr
. Что вам нужно сделать, так это перенаправить stderr
, например:
sh -x your_script.sh 2> debug_info.txt
Если вы хотите отличить вывод stderr
из-за set -x
от обычного stderr
, вы можете использовать тот факт, что вывод set -x
имеет префикс $ PS4
, который по умолчанию равен +
.
bash -x your_script.bash 2> \
\
>(tee >/dev/null \
>(grep '^\+ ' > set_x_output.txt)\
>(grep -v '^\+ ' > rest_of_sdterr.txt)\
)
Если часть вашего обычного вывода stderr
начинается с +
, вы можете изменить префикс по умолчанию, изменив PS4
.
Мне удалось исправить перенаправление с помощью этой команды:
exec 2>> (tee -a $ LOG_FULL_NAME 2> & 1 | grep -v "^ + \ | ^ ++") 1> & 2