我现在正浪费这么多时间试图弄清楚这么简单的事情......
伪代码(几种语法混合,抱歉):
cmd1 = "find /my/starting/path -type f | grep -v -f /my/exclude/files"
cmd2 = " nl -ba -s' ' "
cmd3 = " | xargs mv -t /move/here/dir "
echo run_command_and_return_output($cmd1$cmd2)
$cmd1$cmd3 # just this now...
# i don't actually want a function... but the name explains what i want to do
function run_command_and_return_output(){ /* magic */ }
这有效....
FIND=$(find $LOG_DIR -type f | grep -v -f $EXCLUDE | nl -ba -s' ')
printf "%s\n" "$FIND"
这不......
NL="nl -ba -s' '"
FIND=$(find $LOG_DIR -type f -mtime +$ARCH_AGE | grep -v -f $EXCLUDE | $NL)
printf "%s\n" "$FIND"
,这也不是......
NL='nl -ba -s'\'' '\'' '
但是,这确实有效:
find /my/starting/path -type f | grep -v -f /my/exclude/files | nl -ba -s' '
或
FIND=$(find $LOG_DIR -type f -mtime +$ARCH_AGE | grep -v -f $EXCLUDE | nl -ba -s' ' )
答案 0 :(得分:3)
简短形式:扩展$foo
不加引号通过字符串拆分和glob扩展来运行内容,但不语法解析。这意味着在不同的上下文中进行引用和转义的字符不会被视为语法,而只被视为数据。
如果你想通过语法分析来运行一个字符串,请使用eval
- 但请注意这些注意事项,这些注意事项很大且对安全性有影响。
更好的方法是使用正确的工具 - 在shell数组中构建单独的简单命令(不是管道!),并使用函数作为构造复杂命令的可组合单元。 BashFAQ #50描述了这些工具 - 并深入讨论了哪些工具适用于何时。
更具体一点:
nl=( nl -ba -s' ' )
find_output=$(find "$log_dir" -type f -mtime "+$arch_age" | grep -v -f "$exclude" | "${nl[@]}")
printf "%s\n" "$find_output"
...是正确的,因为它将简单命令nl
跟踪为数组。