使用可打印颜色的子命令设置PS1

时间:2018-09-13 21:08:45

标签: bash sh prompt git-bash

将ANSI颜色代码放入JobLauncherTestUtils.setJob(Job job)时,它们必须用@Configuration public class TestBatchConfiguration implements MergedBeanDefinitionPostProcessor { @Autowired @Qualifier("JobA") private Job job; @Bean(name="jtestl") public JobLauncherTestUtils jobLauncherTestUtils() { JobLauncherTestUtils jobLauncherTestUtils = new JobLauncherTestUtils(); jobLauncherTestUtils.setJob(job); return jobLauncherTestUtils; } /** * https://stackoverflow.com/questions/22416140/autowire-setter-override-with-java-config * This is needed to inject the correct job into JobLauncherTestUtils */ @Override public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) { if(beanName.equals("jtestl")) { beanDefinition.getPropertyValues().add("job", getMyBeanFirstAImpl()); } } private Object getMyBeanFirstAImpl() { return job; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } } 包围,否则提示可能会混淆该行的可编辑部分的开始位置。但是,当子命令(PS1)打印颜色时,\[\]转义符总是按字面意义写到提示中的,而且在我的历史记录中有足够长的命令,提示会变得混乱。

这是一个例子:

$()

预期:

\[\]

实际({ps1test() { ps1sub() { printf '\[\033[32m\]Hello!\[\033[0m\]' } PS1='$(ps1sub) \$ ' } 由Git for Windows安装):

$ ps1test
Hello! $

如何让我的shell解释子命令中的bash转义?

2 个答案:

答案 0 :(得分:2)

如果您尝试创建动态提示,则可能更容易通过通过PS1调用的函数来设置PROMPT_COMMAND值,例如:

ps1test() {
  ps1sub() {
        printf '\[\033[32m\]Hello!\[\033[0m\]'
    }
    PS1="$(ps1sub)"' \$ ' # notice the double-quote
}
PROMPT_COMMAND=ps1test

这对我来说正确地显示为Hello! $

我使用prompt.gem来呈现提示,您可以看看它如何configures PROMPT_COMMAND来获得启发。

答案 1 :(得分:0)

这正是eval的正确用例:

ps1test() {  
    ps1sub() {  
        printf '\[\033[31m\]Hello!\[\033[0m\]';     
    };  
    eval PS1="'$(ps1sub) \$ '"; 
}