使用自己的脚本临时更改Bash提示符

3

我希望编写一个小型的shell脚本,在命令提示符过长时缩短它。在bash中设置PS1变量是可以正常工作的。当我尝试在脚本中直接运行相同的命令时,却没有任何反应。

#!/bin/bash

PS1='\u:\W\$ '

我尝试过eval "PS1='\u:\W\$ '"export PS1='\u:\W\$ 'exec PS1='\u:\W\$ ',但都没有结果。

如何才能实现与bash中直接输入相同的结果?

谢谢您的帮助。


顺便提一下,你可以考虑使用shell函数而非脚本来完成这个任务。 - Charles Duffy
这意味着将一个函数添加到/.profile或者/bashrc中吗? - emergo
~/.bashrc,而不是~/.profile -- bashrc会为每个交互式shell执行,而profile仅适用于登录shell(除了某些试图为用户“简化”差异的操作系统外,但依赖这些操作系统是不好的),并且常规函数不会被子进程继承,因此(与环境变量不同,后者适用于~/.profile)除非它们在~/.bashrc中,否则您无法在需要它们的任何地方获得它们。 - Charles Duffy
你也可以从 PROMPT_COMMAND 中调用你的函数,这样它就会自动被调用(如果它实际上正在检查终端宽度并决定使用哪个提示符)。 - Charles Duffy
1个回答

2
一般来说,在 UNIX 中,一个进程只能为自己和其子进程更改变量 - 而不能更改其父进程的变量(“其父进程”是调用它的进程)。
你需要“源”脚本而不是执行它,才能影响你的交互式 shell 变量。这将在当前 shell 中执行脚本中的所有命令,而不是启动作为子进程的新 shell(其变量值在退出时被丢弃)。
# in bash
source yourscript

# or in POSIX sh
. yourscript # mind the space!

在这种用法中,shebang 没有任何作用;类似地,+x 权限也不需要。通常情况下,命名脚本旨在被源化而不是执行,使用扩展名映射到它们打算由哪个 shell 使用 (yourscript.bash 用于 bash, yourscript.sh 用于任何 POSIX shell 可以被源化的脚本),而旨在执行而不是源化的脚本则不应具有扩展名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接