用户名的环境变量

用户名的环境变量

Linux 中与 %username% 对应的是什么?

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

目前,我只是修改了每台机器上的脚本以匹配那里使用的用户名。但我希望有一个可以正常工作的脚本,而不需要修改它。

那么:Linux 有这样的功能吗?嗯,我确定它有,你这个菜鸟……

答案1

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

要获取您想要看到的输出,请$USER在命令中使用:

echo $USER

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

/path/with/$USER/in/it

将在字符串中扩展用户名。不过,当变量直接位于其他字符旁边时,应该使用花括号保护变量扩展。在此示例中,这并不那么重要,因为 USER 变量受非字母数字字符的限制,但在以下情况下很重要:

/path/to/${USER}directory

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

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

答案2

$USER

将其更改为您的用户名。

例子

rinzwind@schijfwereld:~$ echo $USER
rinzwind

还有更多...

~$ cd /tmp
:/tmp$ echo $HOME
/home/rinzwind
:/tmp$ echo $PWD
/tmp
$ echo $HOSTNAME
schijfwereld

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

env

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


进一步来说,你也可以创建自己的:

export var=value

将创建具有值的 $var。

$ export var=1111
rinzwind@schijfwereld:~$ echo $var
1111

答案3

$USER如果您计划在以 开头的命令中读取环境变量,则可能需要注意sudo

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

$ echo $USER
bytecommander

$ sudo echo $USER
bytecommander

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

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

    sudo bash -c 'echo $USER'
    
  • 使用命令输出而不是$USER环境变量。

    这里主要有两个有用的命令,whoami分别是id -un

    $ whoami
    bytecommander
    
    $ sudo whoami
    root
    
    $ id -un
    bytecommander
    
    $ sudo id -un
    root
    

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

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

cd /path/to/$(whoami)folder
cd /path/to/$(id -un)folder

答案4

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

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

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

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

相关内容