スペースを含むパスを引数として渡す

スペースを含むパスを引数として渡す

スペースを含む一部の文字列変数をパラメータとしてプログラムに渡すのが困難です。
渡される引数をデバッグして表示するためのデモPythonスクリプトを作成しました。

##### show_args.py #####

import sys

def main():
    # Display the arguments passed to the script
    print "Number of arguments =", len(sys.argv)
    for arg in sys.argv:
        print arg

if __name__ == '__main__':
    main()

ここで問題を示すスクリプトは次のとおりです。

path_with_spaces="$HOME/blah blah"
arg_list="$path_with_spaces/abc $path_with_spaces/xyz"

python show_args.py $arg_list

出力 -:

Number of arguments = 5
show_args.py
/home/anmol/blah
blah/abc
/home/anmol/blah
blah/xyz

私が本当に欲しいのはこれです - :

path_with_spaces="$HOME/blah blah"

python show_args.py "$path_with_spaces/abc" "$path_with_spaces/xyz"

出力 -:

Number of arguments = 3
show_args.py
/home/anmol/blah blah/abc
/home/anmol/blah blah/xyz

スペースがあるパスでのみ問題が発生するかどうかを確認するために、次のスクリプトを作成しました。

path_without_spaces="$HOME/blah"
arg_list="$path_without_spaces/abc $path_without_spaces/xyz"

python show_args.py $arg_list

出力 -:

Number of arguments = 3
show_args.py
/home/anmol/blah/abc
/home/anmol/blah/xyz

この問題に対する解決策を見つけて、偶然発見しました。この回答この方法によると、正しい方法はパラメータを文字列変数の代わりに配列変数に入れることです。
この新しいアプローチを示すスクリプト - :

path_with_spaces="$HOME/blah blah"
arg_list=("$path_with_spaces/abc" "$path_with_spaces/xyz")

python show_args.py "${arg_list[@]}"

出力 -:

Number of arguments = 3
show_args.py
/home/anmol/blah blah/abc
/home/anmol/blah blah/xyz

このソリューションは正常に動作しますが、配列変数の代わりに文字列変数を使用して同じことを行う方法があるかどうかはまだ疑問に思います。

私のシステム構成 -:

  • Ubuntu 14.04 LTS
  • ヘビーストライク 4.3.11
  • GNOME端末3.6.2

ベストアンサー1

存在する:

path_with_spaces="$HOME/blah blah"
arg_list="$path_with_spaces/abc $path_with_spaces/xyz"

python show_args.py $arg_list

スカラー/文字列変数を使用しています。分割+グローバル演算子(変数の引用解除)は、変数の内容を分割して渡す引数を生成しますpython

これ分ける~の一部分割+グローバル演算子は特殊引数に格納されている文字を分割します$IFS

ここで無効にすることができます全体的な状況パスに見つからない文字を分割して分割します。例えば、新しいチーム次のパスに見つかりません。

path_with_spaces="$HOME/blah blah"
arg_list="$path_with_spaces/abc
$path_with_spaces/xyz"
IFS="
"
set -f # disable glob.
python show_args.py $arg_list

evalまた、シェル引用符を使用し、シェルがこれらの引用符を解釈できるようにすることもできます(bashここでは特定の機能が使用されます)。

printf -v arg_list '%q ' "$path_with_spaces/abc" \
                         "$path_with_spaces/xyz"

eval "python show_args.py $arg_list"

おすすめ記事