bash: 运行 "find --exec ..." 以“\;”结尾的命令,都存储在变量中?
bash: run "find --exec ..." command with terminating "\;", all stored in variable?
我试图在 bash 脚本中找到一种方法来构建 find
命令,其中 -exec
存储在变量中,但我无法获得终止\;
如果它是变量的一部分,将被正确识别。
我可以通过在通过变量调用命令时添加 \;
来解决它:
local all_the_things=($($cmd \;))
虽然我不确定当 $cmd
存储不同的命令时它会如何交互(有几个完全不同的上下文以不同的方式获取我需要的列表,其中只有一个是通过 find
命令)。
例如,如果我有以下目录和文件,
$ ls -l /tmp/dir1
total 0
-rw-r--r-- 1 joeuser joemama 0 Jul 15 10:19 1A
-rw-r--r-- 1 joeuser joemama 0 Jul 15 10:19 1B
我想将每个文件名 1A
和 1B
发送到 basename
。以下是我尝试过的几种方法:
#!/bin/bash
cmd="find /tmp/dir1 -exec basename {} \;"
echo; echo "One slash: $cmd"
$cmd
cmd="find /tmp/dir1 -exec basename {} \;"
echo; echo "Two slashes: $cmd"
$cmd
cmd="find /tmp/dir1 -exec basename {} \\;"
echo; echo "Three slashes: $cmd"
$cmd
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# The first of these gets the desired result, but I want the "\;" in $cmd.
# The second shows that the "\;" is being treated as part of the -exec
# option, not its terminator.
cmd="find /tmp/dir1 -exec basename {}"
echo; echo "No slash, will add extra '\;': $cmd"
$cmd \;
cmd="find /tmp/dir1 -exec echo {} \;"
echo; echo "Command is echo, not basename. One slash, will add extra '\;': $cmd"
$cmd \;
并且输出:
$ /tmp/gofind1
One slash: find /tmp/dir1 -exec echo {} \;
find: -exec: no terminating ";" or "+"
Two slashes: find /tmp/dir1 -exec echo {} \;
find: -exec: no terminating ";" or "+"
Three slashes: find /tmp/dir1 -exec echo {} \;
find: -exec: no terminating ";" or "+"
No slash, will add extra '\;': find /tmp/dir1 -exec echo {}
dir1
1A
1B
Command is echo, not basename. One slash, will add extra '\;': find /tmp/dir1 -exec echo {} \;
/tmp/dir1 \;
/tmp/dir1/1A \;
/tmp/dir1/1B \;
有没有办法正确转义“\;”所以它可以存储在 $cmd
中?或者我可以放心,在 ($( ... ))
中添加 \;
以后不会破坏其他东西吗?
您可以将它们存储到 BASH 数组中:
cmd=(find /tmp/dir1 -exec basename {} \;)
# then execute it as:
"${cmd[@]}"
另一种可能性是为此使用 BASH 函数:
cmdfn() {
find /tmp/dir1 -exec basename {} \;
}
无论我们使用变量还是数组,我们都应该'eval'得到正确的输出
cmd="find /tmp/dir1 -exec basename {} \;"
eval "${cmd}"
我试图在 bash 脚本中找到一种方法来构建 find
命令,其中 -exec
存储在变量中,但我无法获得终止\;
如果它是变量的一部分,将被正确识别。
我可以通过在通过变量调用命令时添加 \;
来解决它:
local all_the_things=($($cmd \;))
虽然我不确定当 $cmd
存储不同的命令时它会如何交互(有几个完全不同的上下文以不同的方式获取我需要的列表,其中只有一个是通过 find
命令)。
例如,如果我有以下目录和文件,
$ ls -l /tmp/dir1
total 0
-rw-r--r-- 1 joeuser joemama 0 Jul 15 10:19 1A
-rw-r--r-- 1 joeuser joemama 0 Jul 15 10:19 1B
我想将每个文件名 1A
和 1B
发送到 basename
。以下是我尝试过的几种方法:
#!/bin/bash
cmd="find /tmp/dir1 -exec basename {} \;"
echo; echo "One slash: $cmd"
$cmd
cmd="find /tmp/dir1 -exec basename {} \;"
echo; echo "Two slashes: $cmd"
$cmd
cmd="find /tmp/dir1 -exec basename {} \\;"
echo; echo "Three slashes: $cmd"
$cmd
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# The first of these gets the desired result, but I want the "\;" in $cmd.
# The second shows that the "\;" is being treated as part of the -exec
# option, not its terminator.
cmd="find /tmp/dir1 -exec basename {}"
echo; echo "No slash, will add extra '\;': $cmd"
$cmd \;
cmd="find /tmp/dir1 -exec echo {} \;"
echo; echo "Command is echo, not basename. One slash, will add extra '\;': $cmd"
$cmd \;
并且输出:
$ /tmp/gofind1
One slash: find /tmp/dir1 -exec echo {} \;
find: -exec: no terminating ";" or "+"
Two slashes: find /tmp/dir1 -exec echo {} \;
find: -exec: no terminating ";" or "+"
Three slashes: find /tmp/dir1 -exec echo {} \;
find: -exec: no terminating ";" or "+"
No slash, will add extra '\;': find /tmp/dir1 -exec echo {}
dir1
1A
1B
Command is echo, not basename. One slash, will add extra '\;': find /tmp/dir1 -exec echo {} \;
/tmp/dir1 \;
/tmp/dir1/1A \;
/tmp/dir1/1B \;
有没有办法正确转义“\;”所以它可以存储在 $cmd
中?或者我可以放心,在 ($( ... ))
中添加 \;
以后不会破坏其他东西吗?
您可以将它们存储到 BASH 数组中:
cmd=(find /tmp/dir1 -exec basename {} \;)
# then execute it as:
"${cmd[@]}"
另一种可能性是为此使用 BASH 函数:
cmdfn() {
find /tmp/dir1 -exec basename {} \;
}
无论我们使用变量还是数组,我们都应该'eval'得到正确的输出
cmd="find /tmp/dir1 -exec basename {} \;"
eval "${cmd}"