Мне интересно, почему следующий скрипт не работает:
#!/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
вашей интерактивной оболочки из скрипта. Если так выразиться, вы не сможете этого сделать. В *nix и Unix-подобных системах характеристики/свойства процесса передаются от родителя к потомку, но никогда наоборот. Например, если вы установите ваш PATH
для include /foo
, а затем запустите скрипт, который попытается запустить bar
, он найдет /foo/bar
— но если вы измените PATH
в скрипте, это не повлияет на вашу интерактивную оболочку. То же самое cd
и для umask
. Это отличия от мира командной строки Windows (пакетного).
Тем не менее, ответ есть, и вы его уже знаете. Если ваш скрипт (10-строчный) называется andy.sh
, то вы должны иметь возможность получить желаемый эффект, набрав source andy.sh
. Но это глупое излишество (если только вы не делаете это просто для практики написания скриптов); просто введите
PS1='\e[1;31m\]\u@\h \W\$\e[0m\] '
в drew.sh
и введите source drew.sh
.
Но также изучите alias
команду.