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
。
sudo
Bash 变量扩展在执行切换用户之前发生,这意味着在切换到 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 environ
或man environ.7
阅读),$USER
由 BSD 派生程序使用,由 System-V 派生程序使用。如果两者都设置,它们应该具有相同的值。两者的存在是历史偶然。(可能存在设置和未设置$LOGNAME
的情况,但我不知道有任何这种情况。)$USER
$LOGNAME
手册environ
页还记录了许多其他常见的环境变量。(它没有记录全部环境变量,因为这样做是不可能的。)