我正在尝试使用此命令获取文件的最后修改日期
TM_LOCAL=`ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'`
Run Code Online (Sandbox Code Playgroud)
执行此行后,TM_LOCAL 的值类似于“2012-05-16 23:18”
我还想检查 PIPESTATUS 以查看是否有错误。例如,如果文件不存在,则ls返回 2。但$?其值为 0,因为它的返回值为awk。
如果我单独运行这个命令,我可以通过查看 ls 的返回值 ${PIPESTATUS[0]}
ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'
Run Code Online (Sandbox Code Playgroud)
但是$PIPESTATUS,如果我将输出分配给第一个示例中的变量,则不会像我预期的那样工作。在这种情况下,$PIPESTATUS数组只有 1 个元素,与$?
所以,问题是,我怎样才能同时获得两者$PIPESTATUS并将输出分配给一个变量?
你可以这样做:
TM_LOCAL=$(ls -l --time-style=long-iso ~/.vimrc | \
awk '{ print $6" "$7 }' ; exit ${PIPESTATUS[0]} )
Run Code Online (Sandbox Code Playgroud)
然后$?将是来自ls. 如果您需要来自多个管道部件的返回代码,这将不起作用(但如果输出不是太大,您可以拆分管道,就像这里一样)。
这是获取完整PIPESTATUS数组和输出的一种相当昂贵的方法。不是很优雅,但还没有发现其他任何东西:
result=$(echo -e "a\nb\nc" | \
( cat ; exit 1 ) | \
( cat ; exit 42 ) ; echo ${PIPESTATUS[@]})
output=$(head -n -1 <<< "$result")
status=($(tail -n 1 <<< "$result"))
echo "Output:"
echo "$output"
echo "Results:"
echo "${status[@]}"
Run Code Online (Sandbox Code Playgroud)
这使:
Output:
a
b
c
Results:
0 1 42
Run Code Online (Sandbox Code Playgroud)