无法制作 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"
,这相当于回显和复制粘贴。但是,请注意,这是脆弱且容易出错的,因为它需要小心转义您当前未执行的文件名。
我尝试制作一个简单的 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"
,这相当于回显和复制粘贴。但是,请注意,这是脆弱且容易出错的,因为它需要小心转义您当前未执行的文件名。