Shell脚本将命令列表作为输入,尝试执行它们并失败

时间:2010-08-12 17:28:36

标签: shell

我和许多尝试编写算法的非工程师或非数学家一样,很直观。我确切的心理类型使我很难学习像计算机或数学这样严肃的事情。一般来说,我更喜欢音频,因为我可以在学习过程中更有效地发挥想象力。

那就是说,我正在尝试编写一个shell脚本来帮助我掌握Linux。为此,我将O'Reilly网站索引中的Linux命令列表复制并粘贴到Python In a Nutshell一书中。我怀疑他们会介意,我感谢他们提供它。这些是文本文件`massivelistoflinuxcommands',为了节省空间而未在下面全部包含......

好的,现在是有趣的部分。如何让这个脚本工作?

#/bin/sh
read -d 'massivelistoflinuxcommands' commands <<EOF

accept
bison
bzcmp
bzdiff
bzgrep
bzip2
bzless
bzmore
c++
lastb
lastlog
strace
strfile 
zmore
znew


EOF

for i in $commands
do

$i --help | less | cat > masterlinuxnow

text2wave masterlinuxnow -o ml.wav

done

3 个答案:

答案 0 :(得分:3)

当您包含错误消息或某些偏离预期行为的特定方式时,它确实很有用。

但是,问题在于:

read -d 'massivelistoflinuxcommands' commands <<EOF

应该是:

read -d '' commands <<EOF

read的分隔符会使它停在它找到的第一个匹配字符串中第一个字符的字符处,因此它停在“bzc”处,因为下一个字符是“m”,它匹配“m” “在”大规模......“的开头。

另外,我不知道应该做什么:

$i --help | less | cat > masterlinuxnow

但可能应该是:

$i --help > masterlinuxnow

但是,您应该能够直接管道text2wave并跳过创建中间文件:

$i --help | text2wave -o ml.wav

此外,您可能希望阻止每个文件覆盖前一个文件:

$i --help | text2wave -o ml-$i.wav

这将创建名为“ml-accept.wav”和“ml-bison.wav”的文件。

我想指出,如果您正在学习Linux命令,则应根据使用频率和/或对初学者的适用性对它们进行优先级排序。例如,您可能不会立即使用bison

答案 1 :(得分:1)

这里的第一个问题是并非每个命令都有--help选项!!事实上,第一个命令,接受,没有这样的选择!更好的方法可能是在每个命令上执行man,因为每个命令更可能存在手册页。因此改变;

$i --help | less | cat > masterlinuxnow

man $i >> masterlinuxnow

请注意,您必须使用追加输出运算符“&gt;&gt;”而不是创建输出运算符“&gt;”在这个循环中。使用create output运算符将在每次迭代时重新创建文件“masterlinuxnow”,因此只包含最后处理的“man $ i”的输出。

您还需要担心该版本的linux上是否存在该命令(许多命令未包含在标准发行版中,或者可能具有不同的名称)。因此,你可能想要更像这样的东西,其中head命令中的-n应该被你想要的行数替换,所以如果你只需要--help输出的前两行你将替换-n和-2 :

if [ $(which $i) ]
then
$i --help | head -n >> masterlinuxnow
fi

而不是read命令,只需像这样定义变量命令:

commands="
bison
bzcmp
bzdiff
bzgrep
bzip2
bzless
bzmore
c++
lastb
lastlog
strace
strfile 
zmore
znew
"

总而言之,以下脚本非常适用:

commands="
bison
bzcmp
bzdiff
bzgrep
bzip2
bzless
bzmore
c++
lastb
lastlog
strace
strfile 
zmore
znew
"

for i in $commands
do

if [ $(which $i) ]
then
$i --help | head -1  >> masterlinuxnow 2>/dev/null
fi
done

答案 2 :(得分:0)

您是否会通过听取帮助说明来学习使用Linux?我真的认为这是一个坏主意。

这些帮助命令通常会列出命令的每个模糊选项,包括许多您永远不会使用的选项 - 尤其是作为初学者。

指导教程或书籍会好得多。它只会呈现最有用的命令和选项。例如,你给出的那些命令列表中有许多我不知道的命令 - 我已经使用Linux / Unix 10年了。