-1

一般来说,我发现将 bash 命令彼此(即复合命令)或变量一起使用会相当混乱。没有什么能像我期望的那样工作。命令需要不同的输入类型(例如 echo 接受字符串,而 find 接受文件名),并且有许多方法可以将信息从一个命令传输到另一个命令(例如 xargs、管道、here-strings ( <<<) 和命令扩展 ( $(command)))。当相互使用命令时,我永远不确定将信息从一个命令传递到另一个命令的正确方法,因此它会按我的预期工作。

一些例子:如果我这样做echo $VAR,它期望变量是一个字符串。如果我这样做grep pattern $VAR,它将期望我的变量是路径名,而不是字符串。要让 grep 将其视为字符串,我必须这样做echo $VAR | grep pattern。因此,为了获得相同的预期读数,我必须为不同的命令输入不同的信息。

另一个例子:我最近想在我的$PATH. 我花了很长时间反复试验才发现我可以使用ls $(sed 's/:/ /g' <<< "$PATH") | grep searchstring. 由于我无法将参数输入ls,似乎grep可以从标准输入读取参数并且ls不能?

具体来说,我想回答的一些问题是:

  1. 我怎么知道哪些命令需要什么类型的输入?
  2. 在命令(或短语)之间传递信息的不同方法之间的有效和语义差异是什么?
  3. 可以在这里有用地使用重定向的输入和输出吗?
  4. 如何在输入类型之间进行更改(例如,如果它需要一个文件名,但我想给它一个字符串)
  5. 我的复合命令将被解析的规则是什么?
  6. 奖励:在上述方法中,我可以在哪里以及如何使用 bash 扩展等(例如,我可以在输入信息后进行 bash 扩展)?
4

2 回答 2

2

不要讨厌,但你必须投入一些阅读和游戏时间来学习命令。您写错的代码越多,然后修复的越多,您学到的就越多。

那里有很多 bash 教程。去一个并开始破解。学习 UNIX 命令和 bash 没有灵丹妙药。就像 Windows 一样,您必须使用界面和命令。

于 2013-03-05T03:54:55.767 回答
1

我怎么知道哪些命令需要什么类型的输入?

如果您确实查看命令的手册页,您可以看到预期的参数以及该命令是否读取标准输入等。

在命令(或短语)之间传递信息的不同方法之间的有效和语义差异是什么?

这取决于命令和情况。有时您可以选择在文件中或通过标准输入(例如 grep -f)提供一些文本,这是您的选择。

可以在这里有用地使用重定向的输入和输出吗?

是的

如何在输入类型之间进行更改(例如,如果它需要一个文件名,但我想给它一个字符串)

从字符串到标准输入,您可以echo $string使用其他方式xargs

我的复合命令将被解析的规则是什么?

不是一个明确的问题 IMO,有一些命令本身强制执行的规则,以及由于当前问题而产生的一些偏好。

奖励:在上述方法中,我可以在哪里以及如何使用 bash 扩展等(例如,我可以在输入信息后进行 bash 扩展)?

你可以用 bash 做任何事情 :) 但是管道输入的扩展需要一些eval花哨的东西。

于 2013-03-05T03:58:33.523 回答