红帽 Linux 企业版
编辑终端配置文件——运行自定义命令而不是我的 shell 自定义命令:
tail -3000f /home/user1/folder/$PROJECT/folder2/folder3/text.log
当我保存并重新启动时,我得到:
tail: cannot open `/home/user1/folder/$PROJECT/folder2/folder3/text.log' for reading
当我将此路径直接复制到另一个终端时,tailing 工作正常。自定义命令是否自动转义 $PROJECT 变量?
答案1
我假设您正在使用 gnome-terminal,并且您提到的“自定义命令”是 gnome-terminal 将运行的自定义命令,而不是默认 shell(通常是 bash)。
Gnome-terminal 是一个终端仿真器。它不了解变量或变量扩展的概念。这就是为什么,如果被告知要执行某个包含 的字符串$PROJECT
,它只会执行该操作,而不会扩展$PROJECT
。变量扩展是 shell 的工作。
阅读维基百科文章终端和壳以便更好地理解终端和shell之间的区别。
如果我的假设正确,即您正在使用自定义命令运行 gnome-terminal,那么您应该使用这个自定义命令:
bash -c "tail -3000f /home/user1/folder/$PROJECT/folder2/folder3/text.log"
这将告诉 gnome-terminal 使用一些参数执行 bash。参数将告诉 bash 使用tail
一些参数执行命令。只是这一次,在执行之前,bash 会在执行之前tail
扩展变量。$PROJECT
请注意,使用参数启动 bash-c
将导致 bash 不读取初始化文件(.bashrc
和/或.profile
)。如果$PROJECT
在其中一个文件中定义了,则上述命令可能会失败,因为$PROJECT
将扩展为无。
您可以使用以下参数强制 bash 读取初始化文件-l
:
bash -l -c "tail -3000f /home/user1/folder/$PROJECT/folder2/folder3/text.log"
请注意,bash 有“登录 shell”和“交互式 shell”的概念,这对读取哪些初始化文件有一些影响。有关差异的更多解释,请阅读以下问题和答案:.bashrc 和 .bash_profile 之间的区别。
答案2
您是否将该命令放入文件中并获取该文件,或者使其可执行并像脚本一样执行它?环境可能未传递给脚本。$PROJECT 是环境变量(导出或设置环境变量)还是当前 shell 中的变量?
如果你使用 bash 或 sh,你可以尝试export $PROJECT
;如果你使用 csh/tcsh,你可以尝试setenv PROJECT=(the value of $PROJECT)
答案3
只是一个猜测——尝试:
tail -3000f /home/user1/folder/${PROJECT}/folder2/folder3/text.log
它使用写为 ${PROJECT} 的变量,而不是 $PROJECT。不幸的是,我无法测试它。