有时我需要编写文本,然后将该文本通过管道传输到另一个命令中。我通常的工作流程是这样的:
vim
# I edit and save my file as file.txt
cat file.txt | pandoc -o file.pdf # pandoc is an example
rm file.txt
Run Code Online (Sandbox Code Playgroud)
我发现这很麻烦并且正在寻求学习 bash 脚本我想通过编写一个命令来使这个过程变得更加简单,该命令会触发打开一个编辑器,当编辑器关闭时将编辑器的输出通过管道传送到 stdout。然后我就可以将命令作为quickedit | pandoc -o file.pdf.
我不确定这将如何工作。我已经编写了一个函数,通过遵循上面的确切工作流程加上一些附加内容来自动执行此操作。它生成一个随机字符串作为文件名,并在调用函数时将其传递给 vim。当用户通过保存文件退出 vim 时,该函数会将文件打印到控制台,然后删除该文件。
function quickedit {
filename="$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32)"
vim $filename
cat $filename
rm $filename
}
# The problem:
# => Vim: Warning: Output is not to a terminal
Run Code Online (Sandbox Code Playgroud)
我很快遇到的问题是,当我做类似quickedit | commandvim 之类的事情时,它本身无法用作编辑器,因为所有输出都被限制在管道中。
我想知道是否有任何解决方法,以便我可以通过管道传输 …
在 bash 脚本中,我想逐行捕获长命令行的标准输出,以便在初始命令仍在运行时对其进行分析和报告。这是我能想象的复杂方法:
# Start long command in a separated process and redirect stdout to temp file
longcommand > /tmp/tmp$$.out &
#loop until process completes
ps cax | grep longcommand > /dev/null
while [ $? -eq 0 ]
do
#capture the last lines in temp file and determine if there is new content to analyse
tail /tmp/tmp$$.out
# ...
sleep 1 s # sleep in order not to clog cpu
ps cax | grep longcommand > /dev/null
done
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更简单的方法。
编辑: …
我怎样才能达到
cmd >> file1 2>&1 1>>file2
Run Code Online (Sandbox Code Playgroud)
也就是说,stdout和stderr 应该重定向到一个文件吗?(file1) 而只有 stdout?(file2) 应该重定向到另一个(都在附加模式下)?
我有一些 Python 脚本,我正在努力重写它们。我对他们都有同样的问题。
我不清楚如何编写程序以使它们表现得像适当的 unix 工具。
因为这
$ cat characters | progname
Run Code Online (Sandbox Code Playgroud)
和这个
$ progname characters
Run Code Online (Sandbox Code Playgroud)
应该产生相同的输出。
我能在 Python 中找到的最接近的东西是 fileinput 库。不幸的是,我真的不知道如何重写我的 Python 脚本,所有这些脚本都是这样的:
#!/usr/bin/env python
# coding=UTF-8
import sys, re
for file in sys.argv[1:]:
f = open(file)
fs = f.read()
regexnl = re.compile('[^\s\w.,?!:;-]')
rstuff = regexnl.sub('', fs)
f.close()
print rstuff
Run Code Online (Sandbox Code Playgroud)
fileinput 库在有标准输入时处理标准输入,如果有文件则处理文件。但它迭代单行。
import fileinput
for line in fileinput.input():
process(line)
Run Code Online (Sandbox Code Playgroud)
我真的不明白。我想如果您正在处理小文件,或者您对文件没有做太多事情,这似乎很明显。但是,就我而言,这比简单地打开整个文件并将其读入字符串要慢得多,如上所述。
目前我运行上面的脚本
$ pythonscript textfilename1 > textfilename2
Run Code Online (Sandbox Code Playgroud)
但我希望能够在管道中运行它(及其兄弟),比如
$ grep pattern textfile1 | pythonscript | pythonscript | pythonscript > …Run Code Online (Sandbox Code Playgroud) 我有一个程序需要在启动时运行,它在 stdout 和 stderr 上有输出,我想使用 logger 命令重定向到系统日志。我在启动脚本中的内容是:
/home/dirname/application_name -v|logger 2>&1 &
这将标准输出重定向到系统日志就好了,但标准错误正在进入控制台,所以我需要改进命令。
当我想轻松阅读我的 PostgreSQL 模式时,我将其转储到以下位置stderr并将其重定向到vim:
pg_dump -h localhost -U postgres dog_food --schema-only | vim -
Run Code Online (Sandbox Code Playgroud)
这给出:
vim 没有语法高亮模式,因为从 stdin 读取时它没有文件扩展名,所以我使用以下内容:
:set syntax=sql
Run Code Online (Sandbox Code Playgroud)
这使:
作为一个懒惰的开发人员,我想vim通过传递命令行参数来强制使用 SQL 语法,这样我set syntax=<whatever>每次打开stdin数据时都不必重新输入。
有没有办法vim通过传递命令行参数来设置语法?
有没有办法通过管道传输命令的输出并将其定向到stdout?
例如,fortune打印一个幸运饼干stdout并将其通过管道传输到下一个命令:
$ fortune | tee >(?stdout?) | lolcat
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and
the Ugly)."
(By Matt Welsh)
Run Code Online (Sandbox Code Playgroud) 我从空目录开始。
$ touch aFile
$ ls
aFile
Run Code Online (Sandbox Code Playgroud)
然后我有ls两个参数,其中一个不在此目录中。我将两个输出流都重定向到一个名为output. 我使用>>是为了避免同时写入。
$ ls aFile not_exist >>output 2>>output
$ cat output
ls: cannot access 'not_exist': No such file or directory
aFile
Run Code Online (Sandbox Code Playgroud)
这似乎有效。这种方法有什么危险吗?
我有一个将文本输出到stdout. 我想在我的终端中看到所有这些输出,同时我想过滤一些行并将它们保存在一个文件中。例子:
$ myscript
Line A
Line B
Line C
$ myscript | grep -P 'A|C' > out.file
$ cat out.file
Line A
Line C
Run Code Online (Sandbox Code Playgroud)
我想在终端中查看第一个命令的输出,并将第二个命令的输出保存在一个文件中。同时。我尝试使用tee,但没有结果,或者更好,结果相反。
我正在运行 CentOS 5.7 并且我有一个备份实用程序,可以选择将其备份文件转储到stdout. 备份文件相当大(数 GB)。目标是一个 SSHFS 文件系统。为了确保我不会占用带宽并降低网络性能,我想限制将数据写入“磁盘”的速度。
如何限制stdout基于字节数的能力?例如,将进程的写入能力限制为大约 768Bps。