Почему при расширении используется разное количество пробелов?

По теме: https://stackoverflow.com/a/7804208/4937930

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

Кроме того, я полагаю, вы видите недокументированное поведение bash в (возможно) неопределенной спецификации. В функции не утверждается никаких ошибок для return на верхнем уровне команд подоболочки, и она просто ведет себя как exit .

ИМХО, это ошибка bash из-за несогласованного поведения return в зависимости от того, находится ли основной оператор в функции или нет.

#!/bin/bash

o() {
    # Runtime error, but no errors are asserted,
    # each $? is set to the return code.
    echo | return 10
    echo $?
    (return 11)
    echo $?

    # Valid, each $? is set to the exit code.
    echo | exit 12
    echo $?
    (exit 13)
    echo $?
}
o

# Runtime errors are asserted, each $? is set to 1.
echo | return 20
echo $?
(return 21)
echo $?

# Valid, each $? is set to the exit code.
echo | exit 22
echo $?
(exit 23)
echo $?

Вывод:

$ bash script.sh 
10
11
12
13
script.sh: line 20: return: can only `return' from a function or sourced script
1
script.sh: line 22: return: can only `return' from a function or sourced script
1
22
23

0
28.02.2018, 22:07
2 ответа

La utilidad expandexpande caracteres de tabulación a la siguiente tabulación implícita. Históricamente, y por tanto por defecto, son cada ocho caracteres, pero puedes cambiarlos con la opción -t.

printf "%s\t%s\t%s\n" 12345 1234 123
12345   1234    123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand
12345   1234    123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand -t 10
12345     1234      123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand -t 10,16
12345     1234  123

Si realmente desea reemplazar la pestaña con ocho espacios, puede usarsed:

printf "%s\t%s\t%s\n" 12345 1234 123 | sed 's/\t/        /g'
3
28.01.2020, 02:18

Esa es exactamente la idea de una pestaña, salta a la siguiente columna, un punto que no cambia con el ancho del campo anterior. Por ejemplo, las pestañas aquí hacen que la segunda columna se alinee bien:

$ echo $'123\tfoobar\n123456\tblahblah'
123     foobar
123456  blahblah

Con el mismo número de espacios en ambas líneas, el resultado sería feo:

123        foobar
123456        blahblah

Con tabulaciones de 8 -caracteres, esto, por supuesto, solo funciona si los valores son de 0 a 7 (o de 8 a 15, etc. )caracteres de ancho, la variación sobre el límite de 8 -caracteres nuevamente da resultado:

$ echo $'123\tfoobar\n123.345e6\tblahblah'
123     foobar
123.345e6       blahblah

Eso requeriría configurar las tabulaciones en algo diferente:

$ echo $'123\tfoobar\n123.345e6\tblahblah' | expand -t 12
123         foobar
123.345e6   blahblah

En lugar de usar pestañas, la otra forma de hacer una salida como esa sería usar printfcon campos de ancho fijo -(esto es esencialmente similar a la salida deexpand):

$ printf "%-11 %s\n" 123 foobar 123.345e6 blahblah
123          foobar
123.345e6    blahblah
1
28.01.2020, 02:18

Теги

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