针对某些程序(比如 proxychains )的文件参数仅支持传入文件名(-f config_file
),也没有读标准输入的方式,我想实现直接在命令行写 inline 的配置文件,应该怎么搞呢。根据我的经验,胡乱试了下,写出了这样的语法:
$ echo <(<<<"hello world")
/proc/self/fd/11
$ ls -l <(<<<"hello world")
lr-x------ 1 wonder wonder 64 6 月 21 15:23 /proc/self/fd/11 -> pipe:[71926512]
$ cat <(<<<"hello world")
hello world
我的实际目标是通过命令行动态设置 proxychains 所用的代理,而不用写多个配置文件,由于上面那种搞法似乎不能断行,我最终这么写的:
proxychains4 -f <(/bin/echo -e "[ProxyList]\nsocks5 127.0.0.1 1082") ssh ubuntu@my-cloud-host
不知道这种语法怎么称呼,哪里有参考呢?
1
Jaylee 2017-06-21 15:42:26 +08:00
不就一个重定向么?
|
2
workwonder OP @Jaylee 不是传统那种,还搞了临时的匿名文件。
|
4
introom 2017-06-21 15:53:34 +08:00 via Android
process substitution 还是什么,我也忘了具体名字。bash 的 manpage 一共才 4000 多行,在 expansion 那块找找,很快就能找到。
|
5
jkeylu 2017-06-21 15:55:37 +08:00
|
6
workwonder OP 我需要根据访问的目标环境使用不同的代理,使用 proxychains 非要搞一个配置文件,好烦。根据上面的写法,我写了一个小脚本,没那么痛苦了: https://gist.github.com/wonderbeyond/6ef3cdc191490e02a6b12162deab4fd7
|
7
workwonder OP @introom 以前知道三个小于号 `<<<` 是把 HERE 文档变成前面命令的标准输入,原来还可以跟 `<()` 结合在一起,文档里面都没有这样的用例。
|
8
araraloren 2017-06-21 16:13:13 +08:00
mark
之前遇到过,把这东西忘了~~ |
9
Jaylee 2017-06-21 20:36:32 +08:00
@workwonder 涨姿势了 居然还有这种操作
|
10
mononite 2017-06-22 09:54:29 +08:00
<() process substitution
<<< here string |
11
quinoa42 2017-06-22 15:13:55 +08:00 1
查了一下,herestring (或者 heredoc 以及其他 redirection )和 process substitution 直接结合在一起的用法实际上是 zsh 支持的功能(至少 bash 4.2.46 是不支持的):
http://zsh.sourceforge.net/Doc/Release/Redirection.html#Redirections-with-no-command > ...if the parameter NULLCMD is set, its value will be used as a command with the given redirections. ...The default for NULLCMD is ‘ cat ’... 所以 `<<<"hello"` 默认等价于 `cat <<< "hello"`,因此 `cat <(<<<"hello")` 会输出 `hello`。 |