如何通过Shell脚本为其他(Python)脚本指定默认命令行参数?

时间:2018-08-13 21:53:27

标签: shell command-line environment-variables command-line-arguments

我对shell的了解很少,我正在做一个小任务,需要一些帮助。

我已经获得了可以解析命令行参数的python脚本。这些参数之一称为“ -targetdir”。未指定-targetdir时,它默认为用户计算机上的/ tmp / {USER}文件夹。我需要将-targetdir定向到特定的文件路径。

我实际上想在脚本中执行以下操作:

设置$ {-targetdir,“文件路径”}}

以便python脚本不设置默认值。有人知道该怎么做吗?我也不确定我是否能提供足够的信息,所以请让我知道我是否模棱两可。

1 个答案:

答案 0 :(得分:1)

强烈建议修改Python脚本,以明确指定所需的默认值,而不是从事此类黑客活动。

也就是说,一些方法:


选项A:功能包装器

假设您的Python脚本名为foobar,则可以编写如下包装函数:

foobar() {
  local arg found=0
  for arg; do
    [[ $arg = -targetdir ]] && { found=1; break; }
  done
  if (( found )); then
    # call the real foobar command without any changes to its argument list
    command foobar "$@"
  else
    # call the real foobar, with ''-targetdir filepath'' added to its argument list
    command foobar -targetdir "filepath" "$@"
  fi
}

如果放入用户的.bashrc中,则从用户的交互式外壳程序中调用foobar的任何操作(假设他们正在使用bash)都将被上述包装替换。注意,这不会影响其他外壳。 export -f foobar会导致bash的其他实例遵守该包装程序,但是不能保证扩展到sh调用所使用的system()实例(Python的Popen(..., shell=True),和系统中的其他位置。


选项B:外壳包装器

假设您将原始foobar脚本重命名为foobar.real。然后,您可以将foobar用作包装器,如下所示:

#!/usr/bin/env bash
found=0
for arg; do
  [[ $arg = -targetdir ]] && { found=1; break; }
done
if (( found )); then
  exec foobar.real "$@"
else
  exec foobar.real -targetdir "filepath" "$@"
fi

使用exec终止包装程序的执行,将其替换为foobar.real,而不会保留在内存中。