在 shell 脚本中...
如何在不剥离任何尾随换行符的情况下将 stdin 捕获到变量?
现在我已经尝试过:
var=`cat`
var=`tee`
var=$(tee)
Run Code Online (Sandbox Code Playgroud)
在所有情况下$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"
Run Code Online (Sandbox Code Playgroud)
如果您想查看完整代码,请查看expandr的 github 页面,这是我为信息安全目的开发的一个小的开源git 关键字扩展过滤器shell 脚本。根据.gitattributes文件(可以是特定于分支的)和git config 中设置的规则,无论何时检入或检出存储库,git 都会通过expandr.sh shell 脚本通过管道传输每个文件。(这就是为什么保留任何尾随换行符或缺少换行符至关重要。)这使您可以清理敏感信息,并为测试、暂存和实时分支交换不同的环境特定值集。
除了 -cvzpf 之外,我从来不需要为 tar 使用任何其他选项。有没有办法将其设置为默认行为?
虽然我认识到通常不可能说出为什么有人以一种方式而不是另一种方式编写程序,但我不明白为什么 tar 不像大多数其他命令行实用程序那样做事情,即:
command -options /source/path /target/path
Run Code Online (Sandbox Code Playgroud)
为什么是这样:
command -options /target/path /source/path
Run Code Online (Sandbox Code Playgroud)