Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux sudo使用什么外壳_Linux_Bash_Shell_Sudo - Fatal编程技术网

Linux sudo使用什么外壳

Linux sudo使用什么外壳,linux,bash,shell,sudo,Linux,Bash,Shell,Sudo,我很抱歉,因为这是其他人提出的一个问题,但这似乎是谷歌的证据。我试图弄清楚调用的是什么shell,因为我遇到了不一致的情况。如果我sudo,我的脚本就不起作用,但是如果我sudobash,脚本就起作用。然而,当我sudo echo$0时,它会说bash cpu=$(cat /proc/cpuinfo | grep Revision | cut -d' ' -f 2-); if [[ "a22082" = $cpu || "a02082" = $cpu ]]; then echo 'do

我很抱歉,因为这是其他人提出的一个问题,但这似乎是谷歌的证据。我试图弄清楚调用的是什么shell,因为我遇到了不一致的情况。如果我
sudo
,我的脚本就不起作用,但是如果我
sudobash
,脚本就起作用。然而,当我
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。

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

详细回答:
sudo
不运行shell。它运行直接传递的命令,而不是中间shell。如果需要shell,则需要显式传递一个

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

让我们比较一些命令:

  • 这将直接执行
    /bin/ls
    可执行文件。不涉及shell。当区别开始发挥作用时,将显示以下命令。

  • 当前shell将扩展全局。如果您无法访问
    /root/
    ,则全局不会展开,您将获得
    ls:cannot access/root/*:无此类文件或目录

  • 这将尝试执行一个名为
    ls/root/*
    的程序。从字面上看,它在
    ls
    root
    子目录中被命名为
    *
    ls
    带有尾随空格)。它会因
    sudo:ls/root/*:未找到命令而失败

  • 这将运行
    /bin/ls
    ,并将文本字符串
    /root/*
    传递给它。没有全局扩展。由于
    ls:cannot access/root/*:没有这样的文件或目录

  • 它执行
    /bin/bash
    ,并插入
    ls/root/*
    命令行,扩展glob。最后,这个命令行是有效的,因为我们有一个显式的shell来扩展glob,我们在
    sudo
    内部而不是外部进行扩展

通过解决该帖子标题所隐含的更一般的问题来补充:

另一方面:最好总是用shebang行启动脚本,以显式地控制它由哪个shell运行

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

  • -s
    (非登录shell)
  • -i
    (登录shell)
至于使用什么shell:
man
表示
-s
(类似于
-i
;强调我的意思):

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


换句话说:
sudo
使用当前用户的默认shell。
sudo echo$(shell)
?也许这有助于等待,我假设
sh
bash
不是同一个shell。当您指定错误的shell时,为什么您希望它能工作呢?我总是亲自为shebang设置
#!/bin/sh
,并发现使用确切的shell更好。@jgr208:
sh
是Bourne外壳(兼容)shell,
bash
是Bourne的又一款shell,它有自己的功能。请看。我的观点是,如果您使用
bash
功能,请在脚本开始时使用
#!/bin/bash
将shebang像
#!/bin/bash
#!/usr/bin/env bash
,一切都会正常。
sudo echo $0
sudo ls
sudo ls /root/*
sudo 'ls /root/*'
sudo ls '/root/*'
sudo bash -c 'ls /root/*'