Отличается ли поведение команды экспорта в sh и bash?

В bash Ctl + alt + e выполняет расширение оболочки, таким образом вводя ! 1255 , а затем нажимая эту комбинацию, заменяет текущую строку содержимым записи истории 1255

-121--29567-

Нажатие клавиши Ctrl + R (которая представляет собой привязку ключа обратного инкрементного поиска emacs как @ gnp, переданную в комментариях) в терминале позволяет выполнять поиск конкретной команды в области. Команда будет показана и может быть отредактирована перед выполнением. Вы увидите что-то подобное:

enter image description here

Источник

-121--29565-

Пока мне повезло получить соединения контейнера, запустив netstat из контейнера:

sudo docker exec -it  netstat

Очевидно, контейнер должен быть установлен.

6
08.06.2018, 14:32
2 ответа

Parece que detectó una desviación POSIX en bashque también es una desviación del histórico Bourne Shell. Puede llamarlo un error o simplemente un comportamiento desviado.

El guión al que te refieres se imprime

1
2

con todos los shells excepto bash en comportamiento predeterminado.

Si llama bash --posix, funciona correctamente.

Según un puntero del usuario Kusalananda, parece que bash por defecto hace que todos los comandos incorporados restauren su entorno temporal al salir y no solo para los comandos incorporados no -especiales. Dado que exportes un componente especial, POSIX requiere que un shell se comporte de la misma manera que un Bourne Shell de principios de la década de 1980 para mantener el valor del entorno.

Dado que bash no implementa esto de manera predeterminada, obtiene la desviación.

2
27.01.2020, 20:30

Sí, el comportamiento es diferente. Toda la descripción no es tan simple.

Primero :¿cuándo es igual?

Esta línea de código:

$ var=1; printf "%s" "$var"; var=2 export var; echo " $var"

Imprimirá 1 2en todos los (no -csh como )shells excepto zsh.

jsh             : 1 2      # ATT version sh (heirloom).
ash             : 1 2
yash            : 1 2
dash            : 1 2
zsh/sh          : 1 2
bash            : 1 2
posixbash       : 1 2
lksh            : 1 2
mksh            : 1 2
ksh93           : 1 2
attsh           : 1 2
zsh             : 1 1

Eso me parece un error de zsh. ¿Cómo puede ser razonable que exportar una variable no retenga el valor exportado?

Pero eso se debe a que la variable exportada:vares la misma var que se imprime.

Exportando alguna otra var.

Si la línea se cambia a algo más similar a lo que está preguntando, con algún otro nombre de variable, como este:

$ var=1; printf "%s" "$var"; var=2 export othervar; echo " $var"

La ​​diferencia (s )se aclara:

jsh             : 1 2
dash            : 1 2
bash            : 1 1
posixbash       : 1 2
ksh93           : 1 2
zsh             : 1 1

Está claro que bash es diferente al viejo sh (Bourne ), el nuevo sh (dash ), ksh y otros (no enumerados aquí ).

Pero lo que es más importante es que bash actúa de manera diferente a bash --posix.

Requisito de Posix.

Algunas de las funciones integradas de shell (no todas )se denominan "integraciones especiales -integradas":

De:2.14. Construcción especial -En servicios públicos

The following "special built-in" utilities shall be supported in the shell command language. … however, the special built-in utilities described here differ from regular built-in utilities in two respects:

  1. An error in a special built-in utility may cause a shell executing that utility to abort, while an error in a regular built-in utility shall not cause a shell executing that utility to abort. …

  2. As described in Simple Commands, variable assignments preceding the invocation of a special built-in utility remain in effect after the built-in completes; this shall not be the case with a regular built-in or other utility.

Entonces, en un comando simple:var=2 specialBuiltinla variable vardebe conservar su valor después de que specialBuiltin haya salido. Pero no todas las implementaciones de shell siguen esa regla.

Entonces, esto debería imprimir1 hello 2(ya que evales un incorporado especial):

var=1; printf '%s ' "$var"; var=2 eval printf %s hello; echo " $var"

Lo hace en shy bash --posixpero no en simple bash.

Lista de construcciones especiales.

De hecho, la lista POSIX de funciones integradas especiales está aquí , siendo la lista:

02 break
03 :
04.
05 continue
06 eval
07 exec
08 exit
09 export
10 readonly
11 return
12 set
13 shift
14 times
15 trap
16 unset

El número en la primera columna es el valor de var utilizado para cada prueba.

Podríamos probar todos los componentes especiales (excepto exit, exec y times )con este código:

var=01;
while : ; do var=02 break; done;    printf ' %s' "02-$var"; var=01
var=03 : ;      printf ' %s' "03-$var"; var=01
echo 'printf " %s" "04-<$var>"' >source-sh
var=04. source-sh; printf ' %s' "04-$var"; var=01
c=0; while ((c++<1)); do
     var=05 continue
     done; printf ' %s' "05-$var"; var=01
var=06 eval 'printf " %s" "06-<$var>"'; printf ' %s' "06-$var"; var=01
#( var=07 exec bash -c  'printf " %s" "07-$var"'); var=01
#( var=08 exit;     printf ' %s' "08-$var" ); var=01 
var=09 export var;  printf ' %s' "09-$var"; var=01
var=10 readonly i;  printf ' %s' "10-$var"; var=01
varfun(){ var=11 return; }; varfun; printf ' %s' "11-$var"; var=01
var=12 set -- aa ;  printf ' %s' "12-$var"; var=01
var=13 shift;       printf ' %s' "13-$var"; var=01
var=15 trap;        printf ' %s' "14-$var"; var=01
var=16 unset j;     printf ' %s' "15-$var"; var=01
echo

Para imprimir esta lista:

jsh             :  02-02 03-03 04-<04> 04-04 05-05 06-<06> 06-06 09-09 10-10 11-11 12-12 13-13 15-15 16-16
dash            :  02-02 03-03 04-<04> 04-04 05-05 06-<06> 06-06 09-09 10-10 11-11 12-12 13-13 15-15 16-16
bash            :  02-01 03-01 04-<04> 04-01 05-01 06-<06> 06-01 09-09 10-01 11-01 12-01 13-01 15-01 16-01
posixbash       :  02-02 03-03 04-<04> 04-04 05-05 06-<06> 06-06 09-09 10-10 11-11 12-12 13-13 15-15 16-16
ksh93           :  02-02 03-03 04-<04> 04-04 05-05 06-<06> 06-06 09-09 10-10 11-11 12-12 13-13 15-15 16-16
zsh             :  02-01 03-01 04-<04> 04-01 05-01 06-<06> 06-01 09-01 10-01 11-01 12-01 13-01 15-01 16-01

Como puede ver, donde posix solicita que var retenga 02, la mayoría de los shells lo retienen e imprimen 02-02, pero no en bash (ni zsh )ya que imprimen 02-01. Solo en exportestá la impresión bash 09-09y la impresión zsh 09-01.

0
27.01.2020, 20:30

Теги

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