Условный оператор в функции для PS1 не переоценивается

No son lo mismo. De hecho [ "$first_arg" == "major" || "$first_arg" == "minor" ]ni siquiera es una expresión válida.

Esto se debe a que [es un comando equivalente a testy no pueden usar la alternativa ||, que opera en el nivel de comando inter -. Lo que históricamente podría considerarse correcto para la alternativa es -o, pero ahora está marcado como obsoleto por POSIX1 , que aconseja reescribir

test "$1" -o "$2"

en

test "$1" || test "$2"

Además de las construcciones testy [, también existe el comando de prueba "moderno" [[, que a su vez no acepta -opor completo, sino que acepta ||.

Por lo tanto, todos estos son válidos y equivalentes:

  1. Una [[prueba:

    if [[ $first_arg == major || $first_arg == minor ]]; then
        exit 1;
    fi
    
  2. Dos [[pruebas:

    if [[ $first_arg == major ]] || [[ $first_arg == minor ]]; then
        exit 1;
    fi
    
  3. Dos [pruebas (el equivalente estándar):

    if [ "$first_arg" = major ] || [ "$first_arg" = minor ]; then
        exit 1;
    fi
    

Las comillas dobles alrededor de $first_argno son necesarias dentro de [[, ya que no hay división de palabras ni expansión de nombre de ruta allí. Sin embargo, las comillas deben usarse con [. Y tampoco tiene sentido citar minorni major. No solo aquí, sino también con testo [. Eso es porque son cadenas simples.

1. Ver USO DE LA APLICACIÓN.

6
22.07.2019, 11:44
2 ответа
export PS1=$(displayPS1);

Это запустит displayPS1и операторы ifвнутри один раз , присвоив результат подсказке. После этого условия больше не обрабатываются.

Вместо этого поместите вызов функции в PROMPT_COMMAND, чтобы он вызывался каждый раз, когда будет напечатано приглашение. Так что либо

PROMPT_COMMAND='PS1=$(displayPS1)'

или, скорее,

PROMPT_COMMAND=setPS1

и сделайте setPS1функцией, которая устанавливает саму PS1. (Избавление от подстановки команд сохраняет ответвление от вызова подоболочки каждый раз, когда изменяется подсказка.)

14
27.01.2020, 20:21

Используйте кавычки.

PS1='$(displayPS1)'

Если этого не сделать, функция оценивается во время назначения.

5
27.01.2020, 20:21

Теги

Похожие вопросы