在shell脚本中...
如何在不删除尾随换行符的情况下将stdin捕获为变量?
现在我已经尝试:
var=`cat`
var=`tee`
var=$(tee)
在所有情况下$var
,输入流都不会包含尾随换行符。谢谢。
还:如果输入中没有尾随换行符,则解决方案不得添加。
根据接受的答案进行更新:
我在代码中使用的最终解决方案如下:
function filter() {
#do lots of sed operations
#see https://github.com/gistya/expandr for full code
}
GIT_INPUT=`cat; echo x`
FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter)
FILTERED_OUTPUT=${FILTERED_OUTPUT%x}
printf '%s' "$FILTERED_OUTPUT"
如果您想查看完整代码,请参阅github页面的expandr,这是我为信息安全目的而开发的一个开源git关键字-扩展过滤器外壳脚本。根据.gitattributes文件(可以是特定于分支的文件)和git config中设置的规则,无论何时将其签入或签出存储库,git都会通过expandr.sh Shell脚本通过管道传输每个文件。(这就是为什么保留任何尾随的换行或缺少换行的关键。)这使您可以清除敏感信息,并交换不同的特定于环境的值集以进行测试,暂存和实时分支。
不,我在这里所做的事情是必要的,因为如果我只是这样做
—
CommaToast
filter
,那么它将在所有最初未以换行符结尾的输入流的末尾添加换行符。实际上,我最初只是这样做,filter
但是遇到了导致该解决方案的问题,因为“总是添加换行符”和“总是删除换行符”都不是可接受的解决方案。
sed
可能会执行额外的换行符-但是您应该filter
不要用其他所有的换行符来处理它。而且您拥有的所有这些功能基本上都做相同的事情-a sed s///
。您正在使用外壳将保存在其内存中的数据通过管道传输到,sed
以便sed
可以用外壳存储在其内存中的其他数据替换该数据,以便sed
可以将其通过管道传输回外壳。为什么不只是[ "$var" = "$condition" ] && var=new_value
呢?我也没有得到数组-您是否在存储数组名称,[0]
然后用sed
替换其中的值[1]
?也许聊天?
@mikeserv-将代码移入内部的好处是
—
CommaToast 2014年
filter
什么?它按原样完美运行。关于链接上的代码如何工作以及为什么要像以前那样设置,是的,让我们在聊天室中讨论一下。
filter
需要stdin
-它运行sed
。你抓住stdin
的$GIT_INPUT
,然后打印回stdout
了一个管道,filter
并赶上它stdout
的$FILTERED_OUTPUT
,然后打印回stdout
。上面示例底部的所有4行都可以替换为:filter
。这里没有冒犯的意思,只是...您在努力工作。您通常不需要外壳变量,只需将输入定向到正确的位置并将其传递即可。