Недостатки присвоения массива переменной вот так: array2=("${array1[@]}")

Насколько я могу судить, у nix нет журнала.Я предполагаю, что причина исключения этой функции из каждого менеджера пакетов в том, что nixos является декларативным, а не императивным, поэтому процесс, через который он прошел, чтобы перевести вашу систему из одного состояния в другое , должен быть не имеет значения.

Это подводит нас к тому, что, я подозреваю, вы действительно хотите знать: Как я могу сравнить текущее поколение с последним?

Я нашел nixos-scripts ' Команда diff-generations очень полезна для этого. Например, если вы используете поколение 115, вы можете получить различие установленных пакетов с помощью:

nix-script diff-generations -s -n 114..115

4
16.02.2018, 13:04
1 ответ

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.

1
27.01.2020, 21:01

Теги

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