【问题标题】:How to force /bin/bash interpreter for oneliners如何为 oneliners 强制 /bin/bash 解释器
【发布时间】:2014-01-21 06:23:00
【问题描述】:

我有一个使用 python os.system() 执行的单行 bash 命令

for FILENAME in mydir/PRE_*; do echo $FILENAME `printf ${FILENAME:0:12}; printf ${FILENAME:23}`; done;

它遍历目录中的所有文件并重命名它们,以从文件名中取出字符 12-23。当我使用服务器登录通过 bash 执行该命令时,该命令运行良好,但是当我使用 web 用户通过 python 执行它时,它会引发错误。

我发现这是因为 web 用户的默认 shell 是 /bin/sh 而不是 /bin/bash。

我可以使用该用户登录并将 shell 更改为 /bin/bash。

所以问题是我可以在不更改用户默认 shell 的情况下强制使用 /bin/bash 执行单行吗?

【问题讨论】:

  • 您可以使用纯 Python 完成相同的操作,而无需使用 bash。我建议改为。
  • 你是对的,我做了 bash,因为它看起来很简单,有点忘了 python 可以做同样的事情。使用 naitive python 代码更清晰,但仍然值得知道如何强制使用 bash 解释器

标签: bash shell sh


【解决方案1】:

或许你可以这样称呼它:

/bin/bash -c '$cmd'

$cmd 是完整的命令行。

【讨论】:

  • 我的双引号有问题,用单引号替换它们并且它起作用了。此处说明:stackoverflow.com/questions/4176347/…
  • 是的,这是正确的,感谢您的链接。我相应地编辑了答案。
  • 在 FreeBSD 上,bash 将安装在 /usr/local/bin
  • 可移植的方法是/usr/bin/env bash
【解决方案2】:
from subprocess import Popen, PIPE, STDOUT

p = Popen(['/bin/bash','-'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
cmdout = p.communicate(input='uname -a\nuptime\nprintenv\n')[0]
print(cmdout)

【讨论】:

  • 在 FreeBSD 上,bash 将安装在 /usr/local/bin
猜你喜欢
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
相关资源
最近更新 更多