最初的想法是接受命令行参数,稍作处理后交由其他程序处理,但是bash会将命令行参数中的引号去掉:
-
问题描述:shell解析命令行参数后(去掉引号)再传递给CLI程序
比如:
git config --global filter.lfs.smudge "git-lfs smudge -- %f" # 程序收到的: git config --global filter.lfs.smudge git-lfs smudge -- %f
-
可以在双引号外面加单引号(这样会保留里面的双引号)、单引号外面加双引号(保留里面的单引号)、或者直接转义,比如:
'filter.lfs.smudge "git-lfs smudge -- %f"' # 程序收到的: filter.lfs.smudge "git-lfs smudge -- %f" "'git-lfs smudge -- %f'" # 程序收到的: 'git-lfs smudge -- %f' filter.lfs.smudge \"git-lfs smudge -- %f\" # 程序收到的: filter.lfs.smudge "git-lfs smudge -- %f"
-
但Git可以:
git config --global 'filter.lfs.smudge "git-lfs smudge -- %f"' error: invalid key: 'filter.lfs.smudge
暂不清楚怎么做到的
-
在Linux中可以使用
' %q' "$@"
转换为shell可以重用的输入格式比如使用
bash -c "$(printf ' %q' "$@")"
(写在shell脚本中)后,git命令可以正常运行# filter.lfs.smudge "git-lfs smudge -- %f" 变为 # filter.lfs.smudge git-lfs\ smudge\ --\ %f $ ./test3.sh git config --global filter.lfs.smudge "git-lfs smudge -- %f" git config --global filter.lfs.smudge git-lfs\ smudge\ --\ %f # --pretty=format:"%h %ad" 变为 # --pretty=format:%h\ %ad $ ./test3.sh git log --pretty=format:"%h %ad" --date=short git log --pretty=format:%h\ %ad --date=short 5bdd3d9 2019-09-17 # 或者直接在命令行使用format后的形式,也可以正常执行相应命令 $ git log --pretty=format:%h\ %ad --date=short 5bdd3d9 2019-09-17 $ git config --global filter.lfs.smudge git-lfs\ smudge\ --\ %f $ git lfs env git-lfs/2.9.1 (GitHub; linux amd64; go 1.13.1) git version 2.17.1 …… git config filter.lfs.process = "git-lfs filter-process" git config filter.lfs.smudge = "git-lfs smudge -- %f" git config filter.lfs.clean = "git-lfs clean -- %f"
-
因此在Linux上执行的程序中,可以手动将参数中的空格及其他特殊符号前加转义符
replace(" ", "\\ ")
, -
关于有关 Python 获取命令行参数中单引号的问题中提到的Python的input()内置函数,测试如下,可以保留引号,但具体使用未尝试
>>> a = input("input:") input:"git-lfs smudge -- %f" >>> type(a) <class 'str'> >>> print(a) "git-lfs smudge -- %f"