Error al ejecutar el comando "sed" que usa variables de shell

Error al ejecutar el comando "sed" que usa variables de shell

Esto me ha estado volviendo loco...

Quiero enumerar archivos en un directorio y, según el número de interacción de todos los archivos excepto el más reciente, aquí está el fragmento de código.


FILECOUNT=$(ls -lt [dir]*.log | grep -c .log )
for (( c=2; c<=$FILECOUNT; c++ ))
do
FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")

He tenido problemas con $cla interpretación, el formato anterior funciona pero el comando sed falla... aunque ingresar la última línea del registro en el cli funciona de maravilla


 FILECOUNT=24

 (( c=2 ))

 (( c<=24 ))

C is : 2

 'ls -1t [dir]*.log | sed -n '\''2 p'\'''

 line 41: ls -1t [dir]*.log | sed -n '2 p': No such file or directory

¡Cualquier ayuda sería muy apreciada!

obviamente es [dir]un directorio válido

Respuesta1

El principal problema que tienes es que pones todo en la sustitución del comando entre comillas dobles:

FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")

Esto le indicaría al shell que localice un archivo ejecutable connombre literal ls -1t [dir]*.log | sed -n '$c p'"y sin argumentos, a diferencia de ejecutar el comando lscon opciones -1ty operando [dir]*.logcuya salida se canalizará al ejecutable sedcon opción -ny argumento '$c p'. Intente eliminar las comillas dobles, como en

FILEDIR=$(ls -1t [dir]*.log | sed -n '$c p')

Sin embargoentonces enfrentará el problema de que la expansión de variables está deshabilitada en su sedcomando entre comillas simples. Unomanera recomendadaes romper el argumento de comillas simples y colocar la variable entre comillas dobles, como en

FILEDIR=$(ls -1t [dir]*.log | sed -n "$c"' p')

Además, debo emitir la advertencia obligatoria.no analizar la salida dels. ;)

información relacionada