¿Cuántos elementos puede almacenar una matriz en un script Unix?

¿Cuántos elementos puede almacenar una matriz en un script Unix?

Necesito verificar los permisos de archivos de los directorios /usr, y el contenido de /tmplos /varsubdirectorios. He tomado los permisos de archivo del directorio y sus archivos de subdirectorio en una matriz por separado para cada uno de /usr, /tmpy /var:

fun() {
  set -A  PR_Uperm -- "/usr" `ls -lRt /bin|grep -v "total"|sed -e '1d' -e '/^$/d' -e '/^l/d'|awk '{print $1}'`
  set -A  PR_Tperm -- "/tmp" `ls -lRt /bin|grep -v "total"|sed -e '1d' -e '/^$/d' -e '/^l/d'|awk '{print $1}'`
  fun2
}

Finalmente, quiero que estas matrices separadas estén en una sola matriz que tenga una función diferente, ya que tenemos alcance dinámico en los scripts. Lo he intentado de la siguiente manera:

fun2(){
  set -A perm ${PR_Uperm[@]} ${PR_Tperm[@]}
}

cuando ejecuto el script aparece este error.

script.sh:79919: subíndice fuera de rango

cuando le doy solo una matriz apermanentematriz como se muestra a continuación, no recibo ningún error.

set -A perm ${PR_Tperm[@]}

Tengo tantas entradas para almacenarpermanenteformación. ¿Cómo puedo aumentar el tamaño de la matriz dinámicamente?conjunto -Ano está relacionado con bash, pero este aumento dinámico podría ser el mismo para bash y ksh, así que lo he incluido.

Intenté almacenar en un archivo temporal como se muestra a continuación:

printf "/usr\n`ls -lRt /usr|grep -v "total"|sed -e '1d' -e '/^$/d' -e '/^l/d'|awk '{print $1}'`\n" >> /tmp/output2.txt  # not working in ksh, but working when I run as bash
ksh: no space

ls -lRt /usr|grep -v "total"|sed -e '1d' -e '/^$/d' -e '/^l/d'|awk '{print $1}' >> /tmp/output2.txt # it is working

¿Por qué el primer comando se ejecutó correctamente en bash pero en ksh?

Respuesta1

Bash, si mal no recuerdo, no tiene ningún límite incorporado en el tamaño de la matriz. KornShell93 admite índices de hasta 64k aproximadamente en versiones recientes (y hasta 4095 en versiones anteriores).

Existe una utilidad llamada mtreeque se utiliza para comparar una jerarquía de archivos con una especificación. Cualquier desviación de la especificación (archivos o directorios faltantes, o discrepancias de propiedad/permisos) se informa y, opcionalmente, se corrige (si es posible).

Como no sé en qué Unix estás, no puedo indicarte dónde encontrar esta utilidad. Está dentroEl sistema base de OpenBSD, pero evidentemente tambiéndisponible para linux.

información relacionada