Как будет выглядеть диаграмма для (ls)?

Bueno, "${array[@]}"te da los valores de la matriz, eso es todo. No creo que deba tener ningún problema con eso.

Pero no te da nada fuera de los valores, como índices (como mencionas ), u otros atributos. Las matrices Bash solo se pueden leer -o tener los atributos enteros o en mayúsculas/minúsculas. Por supuesto, lo mismo ocurre con las matrices asociativas :, el resultado de esa asignación sería una matriz indexada normal, pero perder los índices sería el problema más importante. Los atributos probablemente serían fáciles, probablemente sabría qué atributos ha establecido en la matriz.

Una asignación como array2=("${array1[@]}")eliminaría todos los valores originales de array2, por lo que no hay problema con los datos sobrantes. Sin embargo, los atributos de array2se mantendrían, y si se establece una matriz de enteros, los valores de array2se tomarían como expresiones aritméticas. (Igual que en a="1 + 3"; declare -i b=$a; echo $b, que imprime "4".)

Para copiar también los índices, necesitaría usar un bucle (y establecer los atributos manualmente):

# declare -A arr2    # if it was an associative array
arr2=()              # clear the target
for k in "${!arr[@]}" ; do arr2[$k]=${arr[$k]} ; done 

O, para obtener una copia exacta, atributos y todo, la salida de declare -pse puede usar como entrada al shell, por lo que debería copiar ai1a ai2con todas las claves y atributos:

declare -Ai ai1=([foo]=123 [$'a tricky key\n']=456)
definition=$(declare -p ai1)
eval "${definition/ ai1/ ai2}"

Las operaciones de cadena como ${var/pat/repl}funcionan en todos los valores. No creo que debas tener ningún otro problema con eso tampoco. Aunque creo que el asterisco en su patrón está fuera de lugar ya que ${var/pat/repl}junto con ${var##pat}toman la coincidencia más larga,entonces "${var/#prefix*/}"borraría todo el valor.

Probablemente quieras "${myArray[@]#unwanted-prefix}"en su lugar.

-5
30.05.2017, 00:03
1 ответ

Иерархия процессов для (ls)такая же, как и для ls, т.е. → bash → ls, но если вы поместите список команд в круглые скобки :(ls; ls), тогда bash запускает подоболочку и запускает команды в ней. подоболочка. Результирующая иерархия процессов выглядит следующим образом:→ bash → bash → ls(два процесса ls запускаются последовательно ).

Вы можете визуализировать это, используя cat без аргументов вместо ls:(cat; cat). Первый процесс cat ожидает ввода, что дает вам возможность увидеть, что происходит, используя pstreeили topв другом терминале.

0
28.01.2020, 05:21

Теги

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