关于命令行参数中的引号会被bash去掉的问题

最初的想法是接受命令行参数,稍作处理后交由其他程序处理,但是bash会将命令行参数中的引号去掉:

  1. 问题描述:shell解析命令行参数后(去掉引号)再传递给CLI程序

    见:有关 Python 获取命令行参数中单引号的问题

    比如:

    git config --global filter.lfs.smudge "git-lfs smudge -- %f"
    # 程序收到的:
    git config --global filter.lfs.smudge git-lfs smudge -- %f
    
  2. 可以在双引号外面加单引号(这样会保留里面的双引号)、单引号外面加双引号(保留里面的单引号)、或者直接转义,比如:

    '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"
    
  3. 但Git可以:

    git config --global 'filter.lfs.smudge "git-lfs smudge -- %f"'
    error: invalid key: 'filter.lfs.smudge
    

    暂不清楚怎么做到的

  4. 在Linux中可以使用 ' %q' "$@"转换为shell可以重用的输入格式

    How to keep quotes in Bash arguments?

    Preserve Quotes in bash arguments

    比如使用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"
    
  5. 因此在Linux上执行的程序中,可以手动将参数中的空格及其他特殊符号前加转义符 replace(" ", "\\ ")

  6. 关于有关 Python 获取命令行参数中单引号的问题中提到的Python的input()内置函数,测试如下,可以保留引号,但具体使用未尝试

    >>> a = input("input:")
    input:"git-lfs smudge -- %f"
    >>> type(a)
    <class 'str'>
    >>> print(a)
    "git-lfs smudge -- %f"
    
  7. Shell Command Line Quoting Mechanisms

你可能感兴趣的:(CLI)