Linux sudo使用什么外壳
我很抱歉,因为这是其他人提出的一个问题,但这似乎是谷歌的证据。我试图弄清楚调用的是什么shell,因为我遇到了不一致的情况。如果我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
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
值
让我们比较一些命令:
-
这将直接执行
可执行文件。不涉及shell。当区别开始发挥作用时,将显示以下命令。/bin/ls
-
当前shell将扩展全局。如果您无法访问
,则全局不会展开,您将获得/root/
ls:cannot access/root/*:无此类文件或目录
-
这将尝试执行一个名为
的程序。从字面上看,它在ls/root/*
的ls
子目录中被命名为root
(*
带有尾随空格)。它会因ls
sudo:ls/root/*:未找到命令而失败
-
这将运行
,并将文本字符串/bin/ls
传递给它。没有全局扩展。由于/root/*
ls:cannot access/root/*:没有这样的文件或目录
-
它执行
,并插入/bin/bash
命令行,扩展glob。最后,这个命令行是有效的,因为我们有一个显式的shell来扩展glob,我们在ls/root/*
内部而不是外部进行扩展sudo
sudo
不运行shell,但可以使用以下选项之一运行shell:
(非登录shell)-s
(登录shell)-i
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/*'