我是一个Vim新手.我想将当前缓冲区的内容发送到外部命令的stdin(比方说邮件).我的最终目的是设置一个快捷方式,以便从当前的Vim缓冲区快速发送电子邮件.我猜这应该是一个微不足道的东西,但我找不到一种方法将Vim缓冲区发送到外部命令.提前致谢.
在GitHub上,我想在Markdown中构建一个包含代码片段的表.它工作正常,除非我在反引号(即`)字符之间放置一个管道char(即|).
这就是我想要的:
a | r
------------|-----
`a += x;` | r1
`a |= y;` | r2
Run Code Online (Sandbox Code Playgroud)
问题是第二行的代码语句中的垂直条被解释为列分隔符.然后表格渲染看起来很丑陋.我怎么能避免这种情况?
请注意,我已经尝试使用|HTML代码,但它产生了a |= y;.
我想做这个:
举个例子,假设我想从a获取命令名$PID(请注意这只是一个例子,我并不是说这是从进程id获取命令名的最简单方法 - 我的真正问题在于另一个命令,其输出格式我无法控制).
如果我跑,ps我得到:
PID TTY TIME CMD
11383 pts/1 00:00:00 bash
11771 pts/1 00:00:00 ps
现在我做的ps | egrep 11383,并得到
11383 pts/1 00:00:00 bashRun Code Online (Sandbox Code Playgroud)
下一步:ps | egrep 11383 | cut -d" " -f 4.输出是:
<absolutely nothing/>
Run Code Online (Sandbox Code Playgroud)
问题是cut通过单个空格切割输出,并且ps在第2列和第3列之间添加一些空格以保持表的某些相似性,cut选择空字符串.当然,我可以cut用来选择第7个而不是第4个字段,但是我怎么知道,特别是当输出是预先变量和未知的时候.
Bash允许使用: cat <(echo "$FILECONTENT")
Bash还允许使用: while read i; do echo $i; done </etc/passwd
结合前两个可以使用: echo $FILECONTENT | while read i; do echo $i; done
最后一个问题是它创建了子shell,而在while循环结束后,变量i不再被访问.
我的问题是:
如何实现这样的目标:while read i; do echo $i; done <(echo "$FILECONTENT")或者换句话说:我怎样才能确定i循环中存活?
请注意我知道封闭while语句{}但这并不能解决问题(想象一下你想在函数中使用while循环并返回i变量)
有没有一种简单的方法来测试您的命名管道是否正常工作?我想确保我从我的应用程序发送的数据实际上是发送的.是否有一种快速简便的方法来获取所有命名管道的列表?
我很清楚source(又名.)实用程序,它将从文件中获取内容并在当前shell中执行它们.
现在,我正在将一些文本转换为shell命令,然后运行它们,如下所示:
$ ls | sed ... | sh
Run Code Online (Sandbox Code Playgroud)
ls只是一个随机的例子,原始文本可以是任何东西.sed也是一个转换文本的例子.有趣的是sh.我管道我得到的任何东西sh,它运行它.
我的问题是,这意味着启动一个新的子shell.我宁愿让命令在我当前的shell中运行.就像我能够做的那样source some-file,如果我在文本文件中有命令.
我不想创建临时文件因为感觉很脏.
或者,我想以与当前shell完全相同的特性启动我的子shell.
好吧,使用反引号的解决方案当然有效,但我经常需要在检查和更改输出时这样做,所以我更喜欢是否有办法将结果输入到最后.
啊,/dev/stdin事情看起来很漂亮,但是,在一个更复杂的情况下,它没有用.
所以,我有这个:
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/git mv -f $1 $2.doc/i' | source /dev/stdin
Run Code Online (Sandbox Code Playgroud)
这确保所有.doc文件的扩展名都是小写的.
顺便说一下,可以处理xargs,但除此之外.
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git …Run Code Online (Sandbox Code Playgroud) 尝试编写一个Angular 2管道,该管道将获取一个JSON对象字符串并将其返回相当打印/格式化以显示给用户.
例如,它需要:
{"id":1,"number":"K3483483344","州":"CA","有效":true}
并在HTML中显示时返回看起来像这样的内容:
所以在我看来,我可以有类似的东西:
<td> {{ record.jsonData | prettyprint }} </td>
Run Code Online (Sandbox Code Playgroud) 我找到了一个将数字限制为2位小数并将数字转换为货币数量的示例 - 例如£2.55.
{{ number | currency : 'GBP' : true : '1.2-2'}}
Run Code Online (Sandbox Code Playgroud)
是否有一个简单的管道在不使用货币的情况下也能做到这一点?
我想将进程proc1的stdout重定向到两个进程proc2和proc3:
proc2 -> stdout
/
proc1
\
proc3 -> stdout
Run Code Online (Sandbox Code Playgroud)
我试过了
proc1 | (proc2 & proc3)
Run Code Online (Sandbox Code Playgroud)
但它似乎没有用,即
echo 123 | (tr 1 a & tr 1 b)
Run Code Online (Sandbox Code Playgroud)
写
b23
Run Code Online (Sandbox Code Playgroud)
stdout而不是
a23
b23
Run Code Online (Sandbox Code Playgroud) 我通常运行我的程序:
perl -e 'print "A"x200' | ./vuln_prog
Run Code Online (Sandbox Code Playgroud)
stdin由gets()C++中的函数使用.
如果这只是一个命令参数,我可以通过执行以下操作打开gdb:
gdb ./vuln_prog
run $(perl -e 'print "A"x200')
Run Code Online (Sandbox Code Playgroud)
但是,我的场景不是命令参数,而是输入(STDIN?).我如何在gdb中调试它?我尝试过很多选项,但似乎没什么用.
我通常只是在进程上运行gdb,当它提示用户输入时,输入它,但是我不想只键入"A".我想输入来自\ x00-\xff的所有字符,我无法输入.