Если это соответствует вашему рабочему процессу, вы можете заставить awk сам открывать канал. Вы не можете сделать это для элемента ARGV
, поэтому вы не получите автоматической итерации awk для строк, считываемых из конвейера. Вместо этого awk будет читать из файлов, переданных в качестве аргументов командной строки, или из стандартного ввода, если аргументов файла не было.
{
printf "Enter input: "
getline var
while (("cat file.txt" | getline) > 0) { … }
}
Эта структура не подходит для вашего игрушечного примера, но я упоминаю ее, потому что она может соответствовать вашей реальной проблеме.
почему оболочка Debian по умолчанию бесцветная
Из-за этого (из .bashrc
в обычной установке Debian, выделено мной):
# uncomment for a colored prompt, if the terminal has the capability; turned # off by default to not distract the user: the focus in a terminal window # should be on the output of commands, not on the prompt #force_color_prompt=yes if [ -n "$force_color_prompt" ]; then if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then # We have color support; assume it's compliant with Ecma-48 # (ISO/IEC-6429). (Lack of such support is extremely rare, and such # a case would tend to support setf rather than setaf.) color_prompt=yes else color_prompt= fi fi
Другими словами, это «особенность» , или выбор дизайна, если хотите.
Полагаю, вы имеете в виду: «Почему root
bash
по умолчанию в Debian приглашение бесцветное?»), Верно?
Если так, то это просто потому, что / etc / profile
- или, скорее, /etc/bash.bashrc
- определяет очень простую подсказку:
# set a fancy prompt (non-color, overwrite the one in /etc/profile)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
и root
по умолчанию .bashrc
не отменяет его:
# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022
См. Откуда берутся /root/.bashrc и /root/.profile в системе Debian? для получения более подробной информации.
Я получил предложение @daniel -sokolowski посмотреть на /etc/skel/.bashrc
.
Но важно отметить, что, согласно документации bash, тест [ -z "$PS1" ]
является обычным способом отличить интерактивную оболочку от не -интерактивной.
Таким образом, когда вы добавляете
# part from /etc/skel/.bashrc
...
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
вы открываете PS1=
для любого типа оболочки, и это может нарушить работу не -интерактивных команд, таких как
ssh your-server ls -la
bash completion on: scp ssh://foo:/bar/<TAB>
vim scp://your-server//some/file
Эти команды будут нарушены, если нежелательный стандартный вывод произойдет из сценариев, предназначенных только для использования в интерактивных оболочках.
Таким образом, полное решение состоит в том, чтобы обернуть блок в [ ! -z "$PS1" ]
тест
...
if [ ! -z "$PS1" ]; then
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
fi
unset color_prompt force_color_prompt