我对shell的了解很少,我正在做一个小任务,需要一些帮助。
我已经获得了可以解析命令行参数的python脚本。这些参数之一称为“ -targetdir”。未指定-targetdir时,它默认为用户计算机上的/ tmp / {USER}文件夹。我需要将-targetdir定向到特定的文件路径。
我实际上想在脚本中执行以下操作:
设置$ {-targetdir,“文件路径”}}
以便python脚本不设置默认值。有人知道该怎么做吗?我也不确定我是否能提供足够的信息,所以请让我知道我是否模棱两可。
答案 0 :(得分:1)
我强烈建议修改Python脚本,以明确指定所需的默认值,而不是从事此类黑客活动。
也就是说,一些方法:
假设您的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)
,和系统中的其他位置。
假设您将原始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
,而不会保留在内存中。