В терминале и скрипте команда Shell выполнялась по-разному

for f in *.txt
do
    [ -f "$f" ] && mv "$f" "${f%txt}text"
done
3
25.08.2018, 14:40
1 ответ

shотличается от bashи ведет себя иначе.

Думаю, что shна самом деле dash.

Кстати, :эта команда ведет себя по-разному, если вы проверяете разные оболочки.

bosh, dash, mksh, zsh, а также kshв Solaris печатают одну обратную косую черту

bashи kshв Linux печатают две обратные косые черты.

Глядя на вывод $shell -x, я считаю, что один обратный слеш является правильным выводом.

Я понятия не имею, почему kshведет себя таким образом в Linux. Возможно, он пытается имитировать bashповедение.

Для bashповедение можно объяснить :bash имеет не -POSIX echo, который не интерпретирует обратную косую черту, как того требует POSIX.

POSIX допускает поведение bashтолько на небольших встроенных системах, а в остальном POSIX требует реализации так называемых расширений XSI. Для echoтребуется полностью следовать поведению echo, реализованному в 1982 году компанией AT&T для SYSv.

Важное замечание:

Если у вас есть скрипт, начинающийся с

#!/bin/bash

и это исполняемый бит (x, установленный chmod), и если вы вызываете

ш мой скрипт

этот сценарий по-прежнему выполняется /bin/sh, который обычно dashв Linux. Поэтому будьте осторожны с тем, как вы запускаете свой код.

Есть способ избежать вашей проблемы. Измените свой сценарий, чтобы использовать:

ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
printf '%s\n' $ch

Таким образом, вы избегаете проблем с echo, которые появились в 1989 году с bash.printfпо-прежнему не решает всех проблем, так как существует много ошибочных реализаций, но обычные проблемы, возникающие из-за обратной косой черты в аргументах, не затрагиваются printf.

2
27.01.2020, 21:25

Теги

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