【问题标题】:What shell does sudo usesudo 使用什么外壳
【发布时间】:2016-06-14 16:39:19
【问题描述】:

我很抱歉,因为这必须是其他人提出的问题,但似乎是谷歌证明。我正试图弄清楚调用了什么 shell,因为我遇到了不一致。如果我sudo,我的脚本不起作用,但如果我sudo bash,它确实有效。然而,当我sudo echo $0 时,它说的是 bash。

cpu=$(cat /proc/cpuinfo | grep Revision | cut -d' ' -f 2-);
if [[ "a22082" = $cpu || "a02082" = $cpu ]]; then
    echo 'do stuff';
fi

如果我用 #!/bin/sh 指定命令解释器,它仍然会失败,但更具体的是 #!/bin/bash 它会失败。

(现在)知道[[ 是特定于 bash 的,但尽管得到了响应,但它似乎不像 sudo 的默认 shell 是 bash。

【问题讨论】:

  • sudo echo $(SHELL) ?也许这可能会有所帮助
  • 等等,我假设shbash 不是同一个shell。当您指定错误的 shell 时,为什么希望它能够工作?
  • 我个人总是发现将#!/bin/sh 用于shebang,并发现使用确切的shell 是更好的做法。
  • @jgr208: sh 是 Bourne Shell(兼容)shell,bash 是 Bourne Again Shell,它有自己的特性。见stackoverflow.com/a/5725402。我的观点是,如果您使用bash 功能,请使用#!/bin/bash
  • 只需将 shebang(如 #!/bin/bash#!/usr/bin/env bash)放在脚本的开头,一切都会正常进行。

标签: linux bash shell sudo


【解决方案1】:

简答:没有默认解释器。您的脚本需要在顶部添加一个 shebang 行 #!/bin/bash

长答案: sudo 不运行 shell。它运行您直接传递的命令,没有中间外壳。如果你想要一个 shell,你需要明确地传递一个。

sudo echo $0

由于$0sudo 被调用之前由您的shell 扩展,此命令具有误导性。它正在打印您当前的$0,而不是sudo'd 环境中$0 的值。

让我们比较一些命令:

  • sudo ls

    这会直接执行/bin/ls 可执行文件。不涉及外壳。当区别开始时,以下命令将显示。

  • sudo ls /root/*

    当前 shell 扩展 glob。如果您无法访问 /root/,则 glob 不会展开,您会得到 ls: cannot access /root/*: No such file or directory

  • sudo 'ls /root/*'

    这会尝试执行名为ls /root/* 的程序。从字面上看,它在ls root 子目录中命名为*ls 带有尾随空格)。它以 sudo: ls /root/*: command not found 失败。

  • sudo ls '/root/*'

    这会运行 /bin/ls 并将文字字符串 /root/* 传递给它。没有全局扩展。它以 ls: cannot access /root/*: No such file or directory 失败。

  • sudo bash -c 'ls /root/*'

    这将执行/bin/bash 并让它插入ls /root/* 命令行,扩展全局。最后,这个可以工作,因为我们有一个明确的 shell 来扩展 glob,并且我们在 sudo 内而不是在它之外进行扩展。

【讨论】:

  • sudo a=e printenv,那谁把a=e解析成环境呢?
  • @JiangYD sudo 处理命令前的变量赋值。
  • 你的意思是 sudo 程序解析a=e 字符串,然后用解析的环境调用printenv 程序?
  • 是的,没错。
【解决方案2】:

通过解决帖子标题所暗示的更一般的问题来补充John Kugelman's helpful answer

附带说明:最好始终以 shebang 行开始脚本,以明确控制运行它的 shell。

sudo 默认情况下不运行 shell,但可以使用以下任一选项来运行 shell:

  • -s(非登录外壳)
  • -i(登录外壳)

至于 what shell 被使用:man states for -s(类似于-i;强调我的):

运行由 SHELL 环境变量指定的 shell(如果已设置)或由调用用户的密码数据库条目指定的 shell。如果指定了命令,则通过 shell 的 -c 选项将其传递给 shell 以执行。如果未指定命令,则执行交互式 shell。

换句话说:sudo使用当前用户的默认shell。

【讨论】:

    猜你喜欢
    • 2012-09-09
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多