假设有一台使用 Ubuntu 的 PC。如何通过 bash 在屏幕上或文件上输出 .sh 文件使用的所有终端命令的列表?运行时不需要命令的输出。我不期望给定脚本有任何输出,我只想确定脚本中使用的命令并将它们保存在要创建的新文件中。
按照.sh 文件的示例:
#!/bin/bash
# Some comments, comments, comments
echo "######################"
echo "# FF_groesse_position"
echo "######################"
echo
echo
######################
# Variables
######################
sleep=5
######################
echo "Programm area"
######################
firefox
sleep 5
echo
echo
x=$(xdotool getdisplaygeometry | cut -d ' ' -f1 )
y=$(xdotool getdisplaygeometry | cut -d ' ' -f2 )
echo "x=$x"
echo "y=$y"
echo
echo
x=$(wmctrl -lG | grep Desktop | tr -s ' ' | cut -d ' ' -f5 )
y=$(wmctrl -lG | grep Desktop | tr -s ' ' | cut -d ' ' -f6 )
echo "x=$x"
echo "y=$y"
echo
echo
read -p "Press Enter or Ctl + C"
想要的输出:
echo
echo
echo
echo
echo
echo
firefox
sleep
echo
echo
xdotool
cut
xdotool
cut
echo
echo
echo
echo
wmctrl
grep
tr
cut
wmctrl
grep
tr
cut
echo
echo
echo
read
也许,可以通过命令 compgen 获取 .sh 文件使用的命令列表,如下所示:
compgen -c file.sh > found_commands.txt
或者通过点赞关注:
set -option file.sh > found_commands.txt
或者通过 bash 以其他方式。
所问答案的形式如下:
command -option file.sh > found_commands.txt
答案1
您可以set -x
在脚本中使用它,并将其与将错误流重定向2>
到文件相结合。
因此,在脚本的开头,使用以下任一方法:
#!/bin/bash -x
或者
#!/bin/bash
set -x
然后,像这样运行脚本:
./file.sh 2> found_commands.txt
对于您的脚本,生成的文件将是:
+ echo "######################"
+ echo "# FF_groesse_position"
+ echo "######################"
+ echo
+ echo
+ sleep=5
+ echo "Programm area"
+ firefox
+ sleep 5
+ echo
+ echo
++ xdotool getdisplaygeometry
++ cut -d ' ' -f1
+ x=$(xdotool getdisplaygeometry | cut -d ' ' -f1 )
++ xdotool getdisplaygeometry
++ cut -d ' ' -f1
+ y=$(xdotool getdisplaygeometry | cut -d ' ' -f2 )
+ echo "x=$x"
+ echo "y=$y"
+ echo
+ echo
++ wmctrl -lG
++ grep Desktop
++ tr -s ' '
++ cut -d ' ' -f5
+ x=$(wmctrl -lG | grep Desktop | tr -s ' ' | cut -d ' ' -f5 )
++ wmctrl -lG
++ grep Desktop
++ tr -s ' '
++ cut -d ' ' -f5
+ y=$(wmctrl -lG | grep Desktop | tr -s ' ' | cut -d ' ' -f6 )
+ echo "x=$x"
+ echo "y=$y"
+ echo
+ echo
+ read -p "Press Enter or Ctl + C"
然后,您可以处理输出文件,并使用以下命令删除所有变量定义正则表达式*
egrep -v "^\++\ ([a-zA-Z])\w*\=" found_commands.txt
导致:
+ echo "######################"
+ echo "# FF_groesse_position"
+ echo "######################"
+ echo
+ echo
+ echo "Programm area"
+ firefox
+ sleep 5
+ echo
+ echo
++ xdotool getdisplaygeometry
++ cut -d ' ' -f1
++ xdotool getdisplaygeometry
++ cut -d ' ' -f1
+ echo "x=$x"
+ echo "y=$y"
+ echo
+ echo
++ wmctrl -lG
++ grep Desktop
++ tr -s ' '
++ cut -d ' ' -f5
++ wmctrl -lG
++ grep Desktop
++ tr -s ' '
++ cut -d ' ' -f5
+ echo "x=$x"
+ echo "y=$y"
+ echo
+ echo
+ read -p "Press Enter or Ctl + C"
最后,你可以使用以下命令提取每行的第二个单词
egrep -v "^\++\ ([a-zA-Z])\w*\=" found_commands.txt | cut -d ' ' -f2 }'
导致:
echo
echo
echo
echo
echo
echo
firefox
sleep
echo
echo
xdotool
cut
xdotool
cut
echo
echo
echo
echo
wmctrl
grep
tr
cut
wmctrl
grep
tr
cut
echo
echo
echo
echo
read
您可以使用 Bash 子 shell 和重定向将其组合成单个命令,如下所示:
./file.sh 2> >(egrep -v "^\++\ ([a-zA-Z])\w*\=" | cut -d ' ' -f2 > found_commands.txt)
现在该文件found_commands.txt
将具有处理后的输出。
如果你不想要重复,而只想知道运行了哪些命令,请使用以下方式进行过滤sort-u
(唯一选项)
./file.sh 2> >(egrep -v "^\++\ ([a-zA-Z])\w*\=" | cut -d ' ' -f2 | sort -u > found_commands.txt)
生成脚本的“依赖项”的字母列表:
cut
echo
firefox
grep
read
sleep
tr
wmctrl
xdotool
RegEx 解析
^
行首\+
加号+
1 个或多个前一个元素\
空间(
开始组[a-z][A-Z]
任意英文字母)
端基\w
单词字符(a-z
、A-Z
、0-9
和_
)*
0 个或多个前一个元素\=
等号