我试图让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=

我希望输出为test=hello world.我试着在"$test"左右加上""引号,这也不管用.

推荐答案

使用

IFS= read var << EOF
$(foo)
EOF

你可以欺骗read人接受这样的管道:

echo "hello world" | { read test; echo test=$test; }

甚至可以编写这样的函数:

read_from_pipe() { read "$@" <&0; }

但是没有意义——你的可变任务可能不会持续!管道可能会产生子shell,其中环境是通过值继承的,而不是通过引用继承的.这就是为什么read不关心来自管道的输入——它是未定义的.

仅供参考,http://www.etalabs.net/sh_tricks.html是一个漂亮的收集所需的原油,以打击古怪和不兼容的伯恩贝壳,上海.

Linux相关问答推荐

使用sed替换字符,但如果它是在bash csv文件中的字符串中,则不使用

通过ssh传输参数时避免字符串拆分

条件句if的正确写法是怎样的?

如何正确Forking 并完成进程以避免 EAGAIN 错误

在 bash 脚本中保持两个进程处于活动状态(并在死亡时重生它们)

如何在Linux下使用正则表达式更改文件名

使用awk命令将以:分隔的两个文件合并的方法

为什么 linux shell diff 命令有时会显示与空行相关的输出,即使存在 -B(--ignore-blank-lines)选项?

如何更改文件的上次访问/修改/更改日期?

在服务器目录之外启动 DolphinDB 服务器时出错

如何使用 shell 脚本查找具有最大上下文长度的行号?

Linux 应用程序分析

无法覆盖符号链接 RedHat Linux

如何在 Ubuntu 12.04 中更改 Jenkins 安装的端口号

./studio.sh 之后的 Android Studio 错误

从核心转储中获取堆栈跟踪

试运行 cron 条目

PHP exec - 判断是否启用或禁用

如何通过进程名获取PID?

编译 OpenGL 程序 GL/glew.h 缺失