对于 djvused 命令,有一个选项:
-e命令
使 djv 用于执行由选项参数命令指定的命令。建议将 djvused 命令用单引号引起来,以防止不必要的 shell 扩展。
例如,djvused myfile.djvu -e 'print-pure-txt'
。
对我来说很不寻常的是,一个命令(此处为 djvused)可以运行其他命令(此处为-e
选项)。我想知道这怎么可能?这是命令行界面中的常见做法吗?
这与 awk 命令中使用的 print 命令类似吗?
我知道一个命令在另一个命令中使用的唯一方法是:
echo `echo hello`
感谢致敬!
答案1
这是很常见的,一些程序专门以此为基础进行工作。
我想到的一些更常见的例子是su
和。sudo
xterm
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)
系统调用以使内核将不同的可执行文件加载到新进程的地址空间中。
对于命令行程序来说,这是一个相对常见的事情,因为它可以很好地重用其他命令。