bash - 如何在函数中停止“* .h”的 Bash 扩展?
问题描述
在尝试运行以下函数时——Bash 以一种意想不到的方式扩展了我的变量——从而阻止了我得到预期的结果。
它归结为 bash 处理"*.h"
我传递给函数的 a 的方式。
这是我调用的函数:
link_files_of_type_from_directory "*.h" ./..
我希望这个变量在某个时候一直保持这种状态,当它到达echo $command_to_run;
我的 Bash 脚本的一部分时......这个变量已经扩展到......
MyHeader1.h MyHeader2.h MyHeader3.h
等等。
我想要的是让 Bash 不扩展我的文件,以便我的代码运行以下内容:
find ./.. -type f -name '*.h'
代替
find ./.. -type f -name MyHeader1.h MyHeader2.h MyHeader3.h
这是代码:
function link_files_of_type_from_directory {
local file_type=$1;
local directory_to_link=$2;
echo "File type $file_type";
echo "Directory to link $directory_to_link";
command="find $directory_to_link -type f -name $file_type";
echo $command;
#for i in $(find $directory_to_link -type f -name $file_type);
for i in $command;
do
echo $i;
if test -e $(basename $i); then
echo $i exists;
else
echo Linking: $i;
ln -s $i;
fi
done;
}
如何防止扩展,以便 Bash 搜索以*.h
我要传入的目录结尾的文件?
更新 1:
所以我已经将调用更新为
link_files_of_type_from_directory "'*.h'" ..
该函数现在组装要评估的命令的字符串,如下所示:
mmd="find $directory_to_link -type f -name $file_type";
当我回应它时,它是正确的:)
find .. -type f -name '*.h'
但我似乎无法让find
命令实际运行。以下是我在尝试正确组装for
循环时遇到的错误/错误:
# for i in $mmd; # LOOPS THROUGH STRINGS IN COMMAND
# for i in '$(mdd)'; # RUNS MMD LITERALLY
# for i in ${!mmd}; # Errors out with: INVALID VARIABLE NAME — find .. -type f -name '*.h':
希望在这方面有所帮助 - 即使这是一个不同的问题:)
解决方案
通过引用变量、删除分号并将循环包装到一个-exec
动作中以防止文件名中的空格、制表符和换行符出现问题,您的函数如下所示:
function link_files_of_type_from_directory {
local file_type=$1
local directory_to_link=$2
echo "File type $file_type"
echo "Directory to link $directory_to_link"
find "$directory_to_link" -type f -name "$file_type" -exec sh -c '
for i do
echo "$i"
if test -e "$(basename "$i")"; then
echo "$i exists"
else
echo "Linking: $i"
ln -s "$i"
fi
done
' sh {} +
}
推荐阅读
- python - 如何将一系列随机数字典添加到单个列表中
- angularjs - 如何检测我的指令在 AngularJS 1.6+ 中是否可见?
- typescript - 对象图和访问者模式
- php - 使用 Docker 同时运行多个 Web 开发环境
- visual-studio - 无法在设备上上传应用程序
- javascript - 如何在外部 .js 文件中分离 .vue 组件的方法?
- sass - 使用 Prepros 在 Chrome DevTools 中实时编辑 SCSS 文件
- python - 为什么 pip-tools 无法推断出正确的版本?
- html - 我必须将标题的宽度设置为大于正文才能完全覆盖。为什么?
- git - 如何删除所有远程分支文件并重新提交本地文件?