MyTetra Share
Делитесь знаниями!
Как в сложных вложенных командах bash понять, кому принадлежат аргументы
Время создания: 17.05.2022 15:59
Текстовые метки: linux, bash, аргументы, вложение, команды, отладка, strace
Раздел: Компьютер - Linux - Bash - Программирование на Bash
Запись: xintrea/mytetra_syncro/master/base/1652792344s1h4ixu83a/text.html на raw.github.com

Иногда в сложных многоуровневых командах Bash очень сложно понять, как вложенные команды будут вызываться и с какими аргументами. Что будет видеть та или иная команда?


Чтобы это выяснить, надо перед командой написать вот такой "префикс":



strace -f -e execve <исследуемаяКоманда>



Вот пример обработки сложной команды, в которой сложно понять, где находятся аргументы команды sudo, и где находятся параметры команды bash.



strace -f -e execve sudo -u postgres bash -c cd /tmp ";" notDir

execve("/usr/bin/sudo", ["sudo", "-u", "postgres", "bash", "-c", "cd", "/tmp", ";", "notDir"], 0x7ffdaa12d828 /* 16 vars */) = 0

strace: Process 20245 attached

[pid 20245] execve("/bin/bash", ["bash", "-c", "cd", "/tmp", ";", "notDir"], 0x606c95c88510 /* 14 vars */) = 0

[pid 20245] +++ exited with 0 +++

--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=20245, si_uid=117, si_status=0, si_utime=0, si_stime=0} ---

+++ exited with 0 +++



Здесь видна вложенность аргументов, с которыми вызываются программы.


Для sudo это: "sudo", "-u", "postgres", "bash", "-c", "cd", "/tmp", ";", "notDir"

Для bash это: "bash", "-c", "cd", "/tmp", ";", "notDir"


Кстати, еще, для понимания как выполняются команды, можно поместить их в bash-скрипт и прописать в него команду:



set -ex



Опция e будет генерировать досрочный выход при обнаружении ошибки.


Опция x при выполнении каждой строки скрипта будет разворачивать ее, если в строке ипользовались какие-либо переменные, и печатать итоговую команду в консоль. Эту опцию считают опцией отладки в bash-скриптах.


Так же в этом разделе:
 
MyTetra Share v.0.58
Яндекс индекс цитирования