如何在Bash命令行参数中转义空格

Cer*_*rin 2 python bash

Bash是否支持在命令行参数中转义空格?

我有一个简单的Python脚本使用argparse来获取从Bash传递的参数,但是当我调用它时:

myscript.py --name="Some Text With Spaces"
Run Code Online (Sandbox Code Playgroud)

我得到一个结果:

args = ['Text', 'With' Spaces']
kwargs = {'name': 'Some'}
Run Code Online (Sandbox Code Playgroud)

我虽然Bash支持空格"\"但尝试

myscript.py --name="Some\ Text\ With\ Spaces"
Run Code Online (Sandbox Code Playgroud)

导致同样的事情.

我是否在滥用Bash,或者这是我在Python方面需要处理的问题?

Cha*_*ffy 6

来自bash结束,最可能的原因是你没有告诉我们你的bash代码的真相.你打的东西看起来很像BashFAQ#50.

运行

myscript.py --name="Some Text With Spaces"
Run Code Online (Sandbox Code Playgroud)

...直接从命令行工作完美,产生一个sys.argv数组['myscript.py', '--name=Some Text With Spaces'].您描述的行为与此一致:

cmd='myscript.py --name="Some Text With Spaces"'
$cmd
Run Code Online (Sandbox Code Playgroud)

...将产生一个sys.argv数组['myscript.py', '--name="Some', 'Text', 'With', 'Spaces"'].


不要那样做.使用数组(如果需要有条件地构建参数行,通常是合适的):

cmd=( myscript.py --name="Some Text With Spaces" )
"${cmd[@]}"
Run Code Online (Sandbox Code Playgroud)

......或一个函数(在所有其他情况下通常是适当的选择):

myscript() { myscript.py --name="Some Text With Spaces" "$@"; }
myscript
Run Code Online (Sandbox Code Playgroud)

  • 对不起,"任意"有点强烈.但是,例如,如果`myscript.py`是硬编码的,那么如果使用``$ {cmd [@]}"`(包含脚本名称)或`myscript.py"$ {cmdargs [@]}"`.但是如果`cmd`的值是从一个未知来源构建的,那么脚本无法控制(不需要更加谨慎)``$ {cmd [@]}``运行`myscript.py`或`rm `.我认为最好确保脚本明确控制运行*命令*,并让该命令的*参数*存储在数组中. (3认同)