我想知道为什么以下脚本不起作用:
#!/bin/bash
read -p 'First lets write PROMPT.SH'
echo '#!/bin/bash'>prompt.sh
echo "export PS1='\e[1;31m\]\u@\h \W\$\e[0m\] '">>prompt.sh
read -p "Change Title and Prompt"
source prompt.sh
echo texttexttext
read -p "Now lets tidy up PROMPT.SH"
rm ./prompt.sh
read -p "That was the program"
我想做的是更改窗口标题、提示和文本颜色,这些我通常都可以做到,
PS1='\e[1;31m\]\u@\h \W\$\e[0m\] '
在常规 bash 会话期间,但当我将其添加到脚本然后运行该脚本时却不行。
答案1
PS1
仅在交互式提示中显示。它与显示的提示无关read -p
。即使读取输入,也不会考虑执行 bash 脚本交互的。
答案2
我不太清楚您要做什么,但我猜这是PS1
从脚本中为您的交互式 shell 进行的设置。这样说,您无法做到。在 *nix 和类 Unix 系统中,进程特征/属性从父级传递到子级,但从不反过来。例如,如果您将设置为PATH
包含/foo
,然后运行尝试运行的脚本bar
,它会发现— 但如果您在脚本中/foo/bar
更改,它不会影响您的交互式 shell。和也是如此。这些是与 Windows 命令提示符(批处理)世界的区别。PATH
cd
umask
话虽如此,答案是有的,而且你已经知道了。如果你的脚本(10 行脚本)名为andy.sh
,那么你应该能够通过输入 来获得你想要的效果source andy.sh
。但这是愚蠢的过度杀伤(除非你只是为了练习编写脚本);只需输入
PS1='\e[1;31m\]\u@\h \W\$\e[0m\] '
进入drew.sh
并输入source drew.sh
。
但也要研究alias
命令。