一个命令在另一个命令中使用

一个命令在另一个命令中使用

对于 djvused 命令,有一个选项:

-e命令

使 djv 用于执行由选项参数命令指定的命令。建议将 djvused 命令用单引号引起来,以防止不必要的 shell 扩展。

例如,djvused myfile.djvu -e 'print-pure-txt'

对我来说很不寻常的是,一个命令(此处为 djvused)可以运行其他命令(此处为-e选项)。我想知道这怎么可能?这是命令行界面中的常见做法吗?

这与 awk 命令中使用的 print 命令类似吗?

我知道一个命令在另一个命令中使用的唯一方法是:

echo `echo hello`

感谢致敬!

答案1

这是很常见的,一些程序专门以此为基础进行工作。

我想到的一些更常见的例子是su和。sudoxterm

su -c 'ls -l /root'
sudo ls -l root
xterm -e 'top -d 10'

和你的例子不一样

echo `echo hello`

其中反引号由 shell 解释,并且程序本身不执行任何操作。

su另请注意和之间的区别sudo。第一个采用字符串,从用户的角度来看可能很难设置这样的字符串,例如扩展变量通过命令可以看到;第二个是一系列字符串,并且要简单得多(示例中没有引号sudo)。

他们用什么来实施内部工作?本质上有两种方法:system库例程和exec系统调用。第一个将调用 shell,并允许各种 shell 扩展,例如

su -c 'ls -ld /root/.*'

而第二种方法不允许这种自由。

答案2

反引号已被弃用,因为它们很难嵌套,并且在不同的字体中不易与撇号区分开。

而是使用 $(cmd),这很简单:

echo $(echo $(echo $(echo $(echo $(echo hello)))))

是的,这是一个经常需要的功能,即使很少使用。

但是,处理命令但不一定再次调用自身的程序数量众多:

  • 贝壳bash, dash, zsh当然喜欢
  • 所有可编写脚本的语言,例如scala, haskell, ruby, python, lua, perl, php, ...
  • 更具体的语言,例如bc, r, ...
  • sql 接口就像psql -c "SELECT foo FROM bar" sampledb
  • 远程 shell 之类的ssh, telnet, ...

答案3

最优秀的 Vim 文本编辑器,它的前身 vi,有这个功能:

当光标位于空行时键入 !)date,命令的输出date将被放入空行中。

在添加到充满笔记的文件或任务列表时,我会使用这个小序列,以便获得带时间戳的条目。

再次在 Vim 中,您可以将光标放在文本段落的第一行,按 V,使用 j 一次向下一行到该段落的最后一行。点击 !fmt 并将文本格式化为少于 80 行的列。 Vim 确实突出显示标记,但一个变体是旧版 vi 上的一个常见技巧,它只有标记: 'a,'b!fmt

至于更多技术问题,可以通过多种方式完成。 C 标准库调用system(3)是运行外部命令的常用方法。该标准库调用可能会对您想要执行的操作强加太多假设,在这种情况下,您将使用系统fork(2)调用来获取新进程,这将更改文件描述符或其他内容,然后调用execve(2)系统调用以使内核将不同的可执行文件加载到新进程的地址空间中。

对于命令行程序来说,这是一个相对常见的事情,因为它可以很好地重用其他命令。

相关内容