От чего зависит появление пробелов в файле, созданном с помощью cat?

Uso de printfy una entrada delimitada xargscompatible con nul -:

printf -- '-f\0%s\0' important-files/*.txt | xargs -0 prog

printfrepite la cadena de formato sobre los argumentos, por lo que para cada nombre de archivo en la expansión del globo, imprimirá -fy el nombre de archivo separados por el carácter nulo. xargsluego lee esto y lo convierte en argumentos para prog. El --necesario ya que algunas implementaciones de printftienen problemas con un -inicial en la cadena de formato. Alternativamente, el -se puede reemplazar con \055, que es estándar.

El mismo principio que la respuesta de Rakesh , pero usando la expansión comodín directamente.

5
21.05.2019, 21:49
2 ответа

Это определяется: )какие символы отправляет эмулятор терминала при нажатии клавиши BackSpace(^H/ BSили ^?/DEL)и b )какой символ используется как VERASEс помощью драйвера tty (см. и измените последний с помощьюstty(1)--stty erase ^H).

Если эмулятор терминала отправляет ^H, но tty не распознает его как специальный символ, нажатие клавиши BackSpace визуально «сотрет» последний символ на экране[1], но символ будет отправлен поскольку -равно (вместе с символом перед ним )для чтения процесса с tty(cat).

Редакторы и интерактивные программы с возможностями редактирования строки -устанавливают tty в необработанный режим и выполняют собственную обработку специальных символов и могут обрабатывать ^Hи ^?одинаково; catне один из них ;-)

[1] это зависит от настройкиechoctlstty--, если она установлена, терминал будет отображать управляющие символы обратно в формате "^"+chr(char^0x40)(^Hдля BS = 8и т. д. ).

4
27.01.2020, 20:39

Вы можете воспроизвести поведение, наблюдаемое с помощью cat, манипулируя характеристиками терминала вашей оболочки с помощью команды stty.

Когда терминал находится в каноническом режиме, ввод собирается в строки, редактирование строк разрешено и, возможно, стандартный ввод выводится на экран (Флаг IEXTEN ).

В неканоническом -режиме некоторые управляющие символы передаются оболочке.

Пример:

stty -icanon
cat > testfile # end with ctrl-c
#typed ls | space | backspace | ctrl-h | al | ctrl-d | ctrl-c
od -a testfile
0000000   l   s  sp del  bs   a   l  nl eot
0000011

Для возобновления канонического режима:

stty icanon

Для опроса текущего оконечного устройства:

stty
# OR for more info
stty -a
speed 9600 baud; rows 62; columns 255; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

Вывод секции флагов этой команды таков, что предшествующий -указывает, что флаг не установлен, поэтому icanonвключен, а -icanonвыключен для канонического флага.

Из справочной страницы:

Optional - before SETTING indicates negation. An * marks non-POSIX settings.

1
27.01.2020, 20:39

Теги

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