Он делает то, что написано на банке.
Когда Bash вызывается как интерактивная оболочка входа или как неинтерактивная оболочка с параметром
- login
, он сначала читает и выполняет команды из файла/ etc / profile
. Он правильно объясняет, что он читает и выполняет / etc / profile
как интерактивную оболочку входа в систему или как неинтерактивная оболочка с опцией - логин
.Это не означает, что это не интерактивная оболочка входа в систему, обозначенная $ 0
, начинающаяся с дефиса.
Однако такое поведение является намеренным, и его можно изменить во время компиляции, раскомментировав параметр времени компиляции, найденный в config-top.h :
/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
/* #define NON_INTERACTIVE_LOGIN_SHELLS */
Это действительно вызывает вопрос однако, почему это поведение было реализовано, когда это не так, IMHO , как можно было бы разумно ожидать, что оно будет работать, особенно когда оно не реализовано таким образом в других оболочках.
Тем не менее, я не думаю, что стандартная оболочка POSIX определяет оболочку входа в систему , поэтому я предполагаю, что она открыта для интерпретации.
Вот способ решения исходной проблемы, который работает с bash
:
$ su - someuser -c 'bash -l -c tmux'
С расширенными регулярными выражениями GNU sed
:
for file in ./*.txt; do
sed -i -r '/^.{9}$/d' "${file}"
done
(Используйте -E
вместо -r
во FreeBSD / macOS ( -E
также будет работать в последних версиях GNU sed
) и -i ''
вместо -i
)
Как указано в don_crissti , с GNU sed
цикл не нужен:
sed -s -i -r '/^.{9}$/d' ./*.txt
С awk
:
for f in ./*.txt; do
awk 'length($0) != 9' "$f" >"destdir/$f"
done
С sed
:
for f in ./*.txt; do
sed '/^.\{9\}$/d' "$f" >"destdir/$f"
done
С помощью grep
:
for f in ./*.txt; do
egrep -vx '.{9}' "$f" >"destdir/$f"
done
Это может сработать:
grep -vE '^.{9}$' filename > new_filename
Переключите 9 на любые необходимые символы.
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
-E, --extended-regexp
Interpret PATTERN as an extended regular expression (ERE, see
below).
.
означает любой символ, {9}
означает соответствие этому шаблону 9 раз.
^
означает начало строки, а $
означает конец линия.
for i in *.txt
do
egrep -v '^.........$' <"$i" >destdir/"$i"
done
Или, если вы настаиваете на использовании sed
, а не egrep
:
for i in *.txt
do
sed '^.........$/d' <"$i" >destdir/"$i"
done
Удалить строки длиной 235 символов:
X=""
for i in `seq 1 235`
do
X="$X."
done
for i in *.txt
do
egrep -v '^'"$X"'$' <"$i" >destdir/"$i"
done
Простота сама!