java - 将 kotlin 程序编译为采用 args[0] 并在控制台中打印的 java jar 后,如何在 bash 中转义 * 乘法符号?
问题描述
我的 bash 版本
$ bash --version
GNU bash, version 4.4.23(1)-release (x86_64-pc-msys)
我的java版本
$ java --version
openjdk 13.0.1 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)
我的 kotlinc 版本
$ kotlinc -version
OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
info: kotlinc-jvm 1.3.50 (JRE 13.0.1+9)
我试过的
$ echo *
chap_six.kt clean.sh hello.jar hello.kt README.md start.sh
$ echo \*
*
我的简单打印程序
// hello.kt
fun main(args: Array<String>) {
println(args[0])
}
编译我的简单打印程序后
kotlinc hello.kt -include-runtime -d hello.jar
我希望在运行 java .jar 时看到控制台中打印的 * 符号
这就是我得到的
$ java -jar hello.jar *
chap_six.kt
$ java -jar hello.jar \*
.git
$ java -jar hello.jar "*"
.git
$ java -jar hello.jar "\*"
\$Recycle.Bin
我尝试应用此答案中的建议,但也失败了
我的hello.sh
#!/bin/bash
FOO="*"
set +f
GLOBIGNORE=*
java -jar hello.jar $FOO
和尝试
$ ./hello.sh
.git
我的hello2.sh
也失败了
#!/bin/bash
FOO="*"
set -f
java -jar hello.jar $FOO
和尝试
$ ./hello2.sh
.git
我的商店看起来像这样
$ shopt
autocd off
cdable_vars off
cdspell off
checkhash off
checkjobs off
checkwinsize off
cmdhist on
compat31 off
compat32 off
compat40 off
compat41 off
compat42 off
compat43 off
completion_strip_exe off
complete_fullquote on
direxpand off
dirspell off
dotglob off
execfail off
expand_aliases on
extdebug off
extglob off
extquote on
failglob off
force_fignore on
globasciiranges off
globstar off
gnu_errfmt off
histappend off
histreedit off
histverify off
hostcomplete on
huponexit off
inherit_errexit off
interactive_comments on
lastpipe off
lithist off
login_shell off
mailwarn off
no_empty_cmd_completion off
nocaseglob off
nocasematch off
nullglob off
progcomp on
promptvars on
restricted_shell off
shift_verbose off
sourcepath on
xpg_echo off
我的 set -o 看起来像这样
$ set -o
allexport off
braceexpand on
emacs on
errexit off
errtrace off
functrace off
hashall on
histexpand on
history on
igncr off
ignoreeof off
interactive-comments on
keyword off
monitor on
noclobber off
noexec off
noglob off
nolog off
notify off
nounset off
onecmd off
physical off
pipefail off
posix off
privileged off
verbose off
vi off
xtrace off
解决方案
不是解决方案,而是确定问题根源的一种手段。
让我们hello.sh
在 Bash 中创建来比较它如何处理参数数组。
#!/usr/bin/env bash
# hello.sh
echo "$1"
现在创建一个test.sh
来比较 Kotlin 和 Bash 中相同 hello 的输出:
#!/usr/bin/env bash
for arg in '*' '\*' "'*'" '"*"'; do
kotlinout="$(java -jar hello.jar $arg)"
bashout="$(bash hello.sh $arg)"
if [ "$kotlinout" = "$bashout" ]; then
comp='are same';
else
comp='DIFFERS !!'
fi
printf 'Argument: %s\tKotink and Bash outputs %s\n' "$arg" "$comp";
printf 'Kotlin output: %s\n' "$kotlinout";
printf 'Bash output: %s\n' "$bashout";
done
这是它在我的环境中的作用:
$ bash test.sh
Argument: * Kotink and Bash outputs are same
Kotlin output: chap_six.kt
Bash output: chap_six.kt
Argument: \* Kotink and Bash outputs are same
Kotlin output: \*
Bash output: \*
Argument: '*' Kotink and Bash outputs are same
Kotlin output: '*'
Bash output: '*'
Argument: "*" Kotink and Bash outputs are same
Kotlin output: "*"
Bash output: "*"
推荐阅读
- java - 如何使用 SOCKS 代理或 java 中的任何其他代理通过 SSL 创建到 AMQP 队列的连接
- dji-sdk - setPhotoTimeIntervalSettings 返回参数非法
- azure-devops - Microsoft Build Engine 升级后无法发布 Angular 应用程序
- keras - keras lstm输入形状错误请帮助:(
- html - 如何在单击时更改按钮 CSS 颜色
- javascript - 如何在 ReactJS 中下载/保存不同来源的不同扩展名的文件?
- c# - .Net 中的最小起订量,带 2 个参数
- excel - 如何手动将 Outlook 添加到引用列表中?
- javascript - 由于变量范围问题而为变量赋值的问题
- python - 将缺失的日期添加到 dt 系列中的 Multiindex