Как изменить сценарий, чтобы он не печатал путь при сравнении?

Вот быстрое -и -грязное частичное решение, совместимое с любой оболочкой, включая busybox.

Более узкая проблема, которую он решает, состоит в том, что :вывод полного stdoutна одну консоль и фильтрация на другой, без временных файлов или именованных каналов.

  • Начать другой сеанс на том же хосте. Чтобы узнать его имя TTY, введите tty. Предположим /dev/pty/2.
  • В первом сеансе запуститеthe_program | tee /dev/pty/2 | grep ImportantLog:

Вы получаете один полный журнал и один отфильтрованный.

-1
19.12.2020, 14:16
1 ответ

Путь выводится командой cd -в конце. Он печатает путь, чтобы вы могли видеть, в каком рабочем каталоге вы оказались. Это особое поведение cdпри вызове с операндом-(одиночным дефисом ), и в этом случае он эквивалентен

. ]
cd "$OLDPWD" && pwd

Чтобы избежать этого, вы можете использовать cd "$OLDPWD"вместо(OLDPWD— это специальная переменная, которая будет содержать значение предыдущего рабочего каталога ), но обратите внимание, что еслиcd /tmpне удалось и ваш код выводит NO, то и cd -, и cd "$OLDPWD"могут привести вас в неожиданный каталог.

Вместо этого используйте

(
    cd /tmp
    if [[ $(echo "`pwd`" | awk -F '/' '{print $NF}') == "tmp" ]]; then
        echo YES
    else
        echo NO
    fi
)

Первый cdне повлияет на рабочий каталог вне подоболочки (...).

Кроме того, ваш тест будет намного безопаснее и эффективнее выполняться с

if [[ $PWD == */tmp ]]; then
    echo YES
else
    echo NO
fi

Переменная PWDбудет содержать путь к текущему рабочему каталогу, и ее часто нужно использовать вместо команды pwd. Тест просто проверяет, заканчивается ли путь к текущему рабочему каталогу строкой /tmp, что, по-видимому, и ваш код awkхочет сделать (, но не сможет сделать, если путь содержит символы новой строки ). ].

Если все, что вам нужно, это проверить, возможно ли cdв /tmp, но не делать этого на самом деле, используйте

( if cd /tmp; then echo YES; else echo NO; fi )

В системах с внешней cdутилитой, такой как macOS и Solaris, вы можете использовать ее следующим образом:

if /usr/bin/cd /tmp; then
    echo YES
else
    echo NO
fi

Внешняя cdутилита никогда не может быть использована для изменения рабочего каталога, но она все же может быть полезна в тестах, подобных этим, которые определяют, будет ли возможен переход в конкретный каталог . См. также В чем смысл внешней команды `cd `?

Если вы хотите проверить, существует ли /tmpи является ли он каталогом (или символической ссылкой на каталог ),то наиболее распространенный способ сделать это не с cd, а с таким тестом:

if [ -d /tmp ]; then
    echo YES
else
    echo NO
fi
2
18.03.2021, 22:41

Теги

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