无法制作 shell 脚本来制作 jar 文件

can't make a shell script to make a jar file

我尝试制作一个简单的 shell 脚本来生成 jar 文件。结合 -C 的 jar 命令不适用于通配符。因此我使用通配符来查找我想要的文件。将它们写入文件,并循环处理它们。

看起来像这样:

the_classes=''

cd "$bin_folder"
tmp_dir=$(mktemp -d -t java_sucks)
find "imui/core/" -type f -name "IMUI_Widget_Agent*.class" >"$tmp_dir/classes.txt" 

while IFS="" read -r p || [ -n "$p" ]
do
    the_classes="${the_classes} -C '$bin_folder' '$p'"

done < "$tmp_dir/classes.txt"

使用上面我完成的命令:

cmd='jar cfm build/IMUI_Widget_Agent.jar'
cmd="${cmd} \"$bin_folder/imui/core/IMUI_Widget_Agent_MANIFEST.MF\" $the_classes"

printf "\n\n\ncmd\n\n\n"

echo $cmd

现在,如果我复制并粘贴此命令来执行它,它就会起作用!

但我想避免每次手动复制和粘贴的体力劳动。

现在我有:

eval "$("$cmd")"

但是我得到一个错误 File name too long。无论我尝试什么,我所做的每一次修复都会产生一个新问题。我已经工作了 6 个小时来制作这个脚本。

什么是向前迈出的好一步?

既然你 cd "$bin_folder" 你实际上并不需要 -C "$bin_folder":

#!/bin/bash
shopt -s globstar
cd "$bin_folder"
jar cfm build/IMUI_Widget_Agent.jar \
    imui/core/IMUI_Widget_Agent_MANIFEST.MF \
    imui/core/**/IMUI_Widget_Agent*.class

但是,如果您仍想将它们添加为更大脚本的一部分,您可以轻松而稳健地在数组中构建命令:

#!/bin/bash
shopt -s globstar
cmd=(jar cfm build/IMUI_Widget_Agent.jar imui/core/IMUI_Widget_Agent_MANIFEST.MF)

cd "$bin_folder"
for file in imui/core/**/IMUI_Widget_Agent*.class
do
  cmd+=(-C "$bin_folder" "$file")
done

echo "About to execute: "
printf "%q " "${cmd[@]}"
echo

"${cmd[@]}"

或者,您可以简单地对您的代码执行 eval "$cmd",这相当于回显和复制粘贴。但是,请注意,这是脆弱且容易出错的,因为它需要小心转义您当前未执行的文件名。