Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash:run";查找--exec…“;带终止符的命令&引用;,全部存储在变量中?_Linux_Bash_Find_Escaping_Exec - Fatal编程技术网

Linux bash:run";查找--exec…“;带终止符的命令&引用;,全部存储在变量中?

Linux bash:run";查找--exec…“;带终止符的命令&引用;,全部存储在变量中?,linux,bash,find,escaping,exec,Linux,Bash,Find,Escaping,Exec,我试图在bash脚本中找到一种方法,用存储在变量中的-exec构建find命令,但无法获取终止的\将被正确识别 我可以通过添加\,来解决这个问题通过变量调用命令时: local all_the_things=($($cmd \;)) 我不确定当$cmd存储一个不同的命令时,它会如何相互作用(有几种不同的上下文以不同的方式获取我需要的列表,其中只有一种是通过find命令) 例如,如果我有以下目录和文件 $ ls -l /tmp/dir1 total 0 -rw-r--r-- 1 joeuser

我试图在bash脚本中找到一种方法,用存储在变量中的
-exec
构建
find
命令,但无法获取终止的
\将被正确识别

我可以通过添加
\,来解决这个问题通过变量调用命令时:

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
中?或者我可以放心添加
\($(…)
中的code>以后不会破坏其他内容吗?

您可以将它们存储到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}"

一般来说,你不能这样做。这是.Etan,这是一个非常有用的链接,非常感谢!