Изменение скрипта bash — вызов изменения цвета приглашения через временный файл

Изменение скрипта bash — вызов изменения цвета приглашения через временный файл

Мне интересно, почему следующий скрипт не работает:

#!/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команду.

Связанный контент