я уже попробовал это в прошлом, и получил к выводу, что очень трудно обеспечить решение, которое будет работать для всех сценариев. Причина в том, что каждый скрипт с сложными командами имеет другой подход к использованию функций оболочки. В случае простого линейного скрипта это может быть так же просто, как использование режима отладки. Например: bash -x script.sh 2>&1 | grep ^+ | awk '{print $2}' | sort -u
В случае, если сценарий имеет некоторые решения, вы можете использовать один и тот же подход, считая, что для случаев «else» команды все равно будут одинаковыми только с разными аргументами или будут что-то тривиальным (echo + exit).
В случае сложного сценария я попытался написать сценарий, который будет просто искать команды в одном и том же месте, где бы я это делал. Задача состоит в том, чтобы создавать выражения, которые помогли бы идентифицировать все использованные возможности, я бы сказал, что это выполнимо для примерно 80-90% скрипта, а вывод должен использоваться только как ссылка, поскольку он будет содержать недопустимые данные (~ 20%).
Вот пример скрипта, который будет анализировать себя, используя очень простой подход (отдельные команды на разных линиях, первое слово будет команда):
# 1. Eliminate all quoted text
# 2. Eliminate all comments
# 3. Replace all delimiters between commands with new lines (; | && ||)
# 4. extract the command from 1st column and print it once
cat $0 \
| sed -e 's/\"/./g' -e "s/'[^']*'//g" -e 's/"[^"]*"//g' \
| sed -e "s/^[[:space:]]*#.*$//" -e "s/\([^\\]\)#[^\"']*$/\1/" \
| sed -e "s/&&/;/g" -e "s/||/;/g" | tr ";|" "\n\n" \
| awk '{print $1}' | sort -u
выход:
.
/
/g.
awk
cat
sed
sort
tr
Есть еще много случаев, чтобы рассмотреть (замены команд, псевдонимы и т. Д.), 1, 2 и 3 только начинаются, но они все равно будут покрывать 80% самых сложных скриптов. Регулярные выражения должны быть скорректированы или расширены для увеличения точности и особых случаев.
В заключение, если вам действительно нужно что-то подобное, вы можете написать сценарий, как указано выше, но не доверяйте выводам, пока не проверите его самостоятельно.
Посмотрите: http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html – Arek
Или это: http://unix.stackexchange.com/questions/20979/how-do -i-list-all-installed-programs – Michael
Arek Спасибо, это помогает немного, но не совсем то, что я искал. Мне нужно знать, что все команды использует сценарий. Я не могу запустить весь скрипт одним выстрелом, поскольку он выполняется частично по аргументам. на данный момент у нас нет всей информации о аргументах. – Sagar