我试图让bash处理来自stdin的数据,但是没有运气.我的意思是以下工作:
echo "hello world" | test=($(< /dev/stdin)); echo test=$test
test=
echo "hello world" | read test; echo test=$test
test=
echo "hello world" | test=`cat`; echo test=$test
test=
Run Code Online (Sandbox Code Playgroud)
我想要输出的地方test=hello world.我试过把""引号括起来"$test"也不起作用.
我似乎无法jq在shell管道中"正常"行事.例如:
$ curl -s https://api.github.com/users/octocat/repos | jq | cat
Run Code Online (Sandbox Code Playgroud)
结果在jq简单的打印出它的帮助文本*.如果我尝试将jq输出重定向到文件,会发生同样的事情:
$ curl -s https://api.github.com/users/octocat/repos | jq > /tmp/stuff.json
Run Code Online (Sandbox Code Playgroud)
jq如果它确定它不是从tty运行的话,是故意拯救?如何防止此行为以便我可以jq在管道中使用?
我有一个shell脚本,我在其中包装一个命令(mvn clean install),将输出重定向到日志文件.
#!/bin/bash
...
mvn clean install $@ | tee $logfile
echo $? # Does not show the return code of mvn clean install
Run Code Online (Sandbox Code Playgroud)
现在,如果mvn clean install失败并出现错误,我希望我的包装器shell脚本也会因该错误而失败.但是因为我将所有输出都传递给tee,所以我无法访问返回代码mvn clean install,所以当我$?之后访问时,它总是0(因为tee成功).
我尝试让命令将错误输出写入单独的文件并在之后检查,但mvn的错误输出始终为空(看起来它只写入stdout).
如何保留返回代码mvn clean install但仍然将输出传递给日志文件?
我正试图做相反的事情
我正在运行一个正在更改其输出格式的应用程序,因为它检测到stdout上的管道,我希望它认为它是一个交互式终端,以便在重定向时获得相同的输出.
我当时认为将它包装在expect脚本中或使用proc_open()PHP中的它会这样做,但事实并非如此.
有什么想法吗?
在grep'ing之后Preserve ls着色中有一个类似的问题,但是如果你把彩色的grep输出管道输入另一个grep,颜色不会被保留,那就很烦人了.
例如grep --color WORD * | grep -v AVOID,不保留第一个输出的颜色.但对我来说ls | grep FILE,保持颜色,为什么差异?
Python的多处理包中队列和管道之间的根本区别是什么?
在什么情况下应该选择一个而不是另一个?什么时候使用有利Pipe()?什么时候使用有利Queue()?
众所周知如何将流程的标准输出管道传输到另一个流程标准输入:
proc1 | proc2
Run Code Online (Sandbox Code Playgroud)
但是如果我想将proc1的标准错误发送到proc2并将标准输出保留到当前位置呢?你会认为bash会有一个命令:
proc1 2| proc2
Run Code Online (Sandbox Code Playgroud)
但是,唉,没有.有没有办法做到这一点?
我有一个python脚本parse.py,它在脚本中打开一个文件,比如file1,然后做一些事情可能会打印出总字符数.
filename = 'file1'
f = open(filename, 'r')
content = f.read()
print filename, len(content)
Run Code Online (Sandbox Code Playgroud)
现在,我使用stdout将结果定向到我的输出文件 - 输出
python parse.py >> output
Run Code Online (Sandbox Code Playgroud)
但是,我不想手动执行此文件,有没有办法自动处理每个文件?喜欢
ls | awk '{print}' | python parse.py >> output
Run Code Online (Sandbox Code Playgroud)
那么问题是如何从standardin读取文件名?或者已经有一些内置函数可以轻松完成ls和那些工作?
谢谢!
我熟悉这种语法:
cmd1 << EOF | cmd2
text
EOF
Run Code Online (Sandbox Code Playgroud)
但刚刚发现bash允许我写:
cmd1 << EOF |
text
EOF
cmd2
Run Code Online (Sandbox Code Playgroud)
(heredoc用作cmd1的输入,cmd1的输出用于cmd2).这似乎是一个非常奇怪的语法.它是便携式的吗?