用户名的环境变量

Dr.*_*ing 7 scripts

%username% 的 Linux 等价物是什么?

我需要每隔几天在多个 Linux 机器上运行一个脚本。我制作了一个 .sh 文件,它工作正常。该脚本会删除某个路径中的一些文件。问题是路径包含用户名(不,不在 /home 中),这在每台机器上都是不同的。

现在,我只是修改了每台机器上的脚本以匹配那里使用的用户名。但我想要一个可以工作的脚本,而无需修改它。

那么:Linux有这样的功能吗?呃,我确定确实如此,你这个菜鸟......

Arr*_*cal 14

引用当前用户的 Linux 版本环境变量是USER.

要获得您希望$USER在命令中使用的输出:

echo $USER
Run Code Online (Sandbox Code Playgroud)

并在另一个字符串(例如路径)中使用它:

/path/with/$USER/in/it
Run Code Online (Sandbox Code Playgroud)

将在字符串中扩展用户名。虽然当一个变量直接紧挨着其他字符时,你应该用花括号保护变量扩展。在这个例子中它并不重要,因为 USER 变量受非字母数字字符的限制,但在以下情况下很重要:

/path/to/${USER}directory
Run Code Online (Sandbox Code Playgroud)

(感谢 ByteCommander 在评论中提供提示)

另一个有用的信息是$HOME用户的主目录。


Rin*_*ind 12

$USER
Run Code Online (Sandbox Code Playgroud)

将其更改为您的用户名。

例子

rinzwind@schijfwereld:~$ echo $USER
rinzwind
Run Code Online (Sandbox Code Playgroud)

还有更多...

~$ cd /tmp
:/tmp$ echo $HOME
/home/rinzwind
:/tmp$ echo $PWD
/tmp
$ echo $HOSTNAME
schijfwereld
Run Code Online (Sandbox Code Playgroud)

列出所有环境变量的当前值:

env
Run Code Online (Sandbox Code Playgroud)

请记住,变量名称区分大小写


对此进行扩展。您也可以创建自己的:

export var=value
Run Code Online (Sandbox Code Playgroud)

将创建具有价值的 $var。

$ export var=1111
rinzwind@schijfwereld:~$ echo $var
1111
Run Code Online (Sandbox Code Playgroud)

  • 与来自 MS 背景的人一起提出区分大小写是一个很好的观点。 (7认同)
  • 请注意,仅当您希望子进程也看到变量及其值时,才需要 `export`。如果它只在当前进程中使用,一个简单的赋值就足够了。此外,您应该在评估变量时引用它们:`echo "$var"` (3认同)

Byt*_*der 9

如果您打算$USER在以sudo.

Bash 变量扩展发生在执行sudo切换用户之前,这意味着$USER变量在sudo切换到 root之前从当前环境中读取。

$ echo $USER
bytecommander

$ sudo echo $USER
bytecommander
Run Code Online (Sandbox Code Playgroud)

如果这不是预期的,并且您需要一个方法来返回它实际运行的用户的名称(通常是“root”),您至少有三个选项来实现:

  • bash以 root 身份运行解释器并将包含$USER. 您必须确保命令用单引号括起来,以防止当前的 Bash 解释器进行变量扩展:

    sudo bash -c 'echo $USER'
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用命令输出而不是$USER环境变量。

    主要有两个命令在这里很有用,whoami以及id -un

    $ whoami
    bytecommander
    
    $ sudo whoami
    root
    
    $ id -un
    bytecommander
    
    $ sudo id -un
    root
    
    Run Code Online (Sandbox Code Playgroud)

    可以通过键入man whoami和找到有关这些命令的更多信息man id

您可以像使用变量一样使用这些命令,并使用 Bash 的命令替换语法将它们嵌入到这样的字符串(例如目录路径)中。以下是两个示例,它们cd进入以当前用户命名的目录:

cd /path/to/$(whoami)folder
cd /path/to/$(id -un)folder
Run Code Online (Sandbox Code Playgroud)

  • `sudo echo $USER` 不显示 `bytecommander`,因为 `sudo` 保留了环境变量——事实上,`sudo` 丢弃了大多数没有被明确配置保留的环境变量。`sudo echo $USER` 显示 `bytecommander` 的原因是变量替换是在结果传递给 `sudo` 之前由 shell 执行的;在您的情况下,它相当于“sudo echo bytecommander”。试试 `sudo sh -c 'echo $USER'`。 (3认同)

Kei*_*son 5

正如其他答案所说,$USER通常设置为当前用户帐户的名称。

但至少在我的系统(Ubuntu 14.04)上,没有$USER为 cron 作业设置环境变量。相反,您可以使用( POSIX ),它cron 作业环境的一部分。$LOGNAME

根据environ(7)手册页(键入man 7 environman environ.7阅读),$USER由 BSD 派生程序使用,并由$LOGNAMESystem-V 派生程序使用。如果它们都设置了,它们应该具有相同的值。两者的存在都是历史的偶然。(可能存在$USER设置和$LOGNAME未设置的情况,但我不知道有没有。)

environ手册页还记录了许多其他常见的环境变量。(它没有记录所有环境变量,因为这是不可能的。)