¿Quiero navegar al subdirectorio donde existe el archivo requerido? usando el script CSH

¿Quiero navegar al subdirectorio donde existe el archivo requerido? usando el script CSH
if(-f runme ) then
    cd `dirname $(find . -iname 'runme')`
    chmod +x runme
    source runme
    cd -

¿ES ESTO CIERTO EN CSH SCRIPT?

Primero, buscará el archivo runme de forma recursiva en los subdirectorios y, si está presente, irá al subdirectorio donde existe este archivo.

Ésta es la pregunta: ¿mi lógica es correcta sintácticamente? Creo que el código actual buscará el archivo runme en el directorio actual.

Encontré una solución, así que pensé en compartirla a continuación. También lo he mencionado en una sección de comentarios.

find . -name "runme" > find_runme.txt

# Just below line used to remove the file name i.e runme here from "find path", and returns only directory path.

set a = `cat find_runme.txt | sed 's/\(.*\/\).*/\1/g'` 
if (-z find_runme.txt) then
cd .
else
cd $a
endif

if(-f runme ) then
  #  cd `dirname $(find . -iname 'runme')`
    chmod +x runme
    setenv PATH /dv/project/agile/xcelium/test/install/install/tools.lnx86/bin:$PATH
    source runme
    cd -

Respuesta1

No hay ninguna buena razón para consumir cshen este siglo.

Aquí, sin embargo, haría:

find . -name runme -type f -execdir chmod +x '{}' ';' -execdir '{}' ';'

Lo cual funcionaría en cualquier shell, incluso cshsuponiendo que findadmita la -execdirextensión BSD (muy común en estos días).

Esoejecutalos runmearchivos, aunque no sourcelos incluye en la instancia de shell actual. En cualquier caso, sourceing no requiere permiso de ejecución.

En cualquier caso, no, su código no tiene una sintaxis csh válida. Pero la buena noticia, si aún no conoce la sintaxis de csh, es que no necesita aprenderla, porque se sabe desde hace al menos 3 décadas que las secuencias de comandos en csh son dañinas y no deben realizarse, por lo que nadie debería hacerlo. esperando que lo hagas.

Si realmente necesita sourceun runmearchivo csh desde un script csh mientras el directorio de trabajo actual es temporalmente el padre de ese archivo, el código se parecería más a:

foreach file ("`find . -name runme -type f`")
  cd $file:h:q || continue
  source $file:t:q
  cd - || break
end

Aunque tenga en cuenta que no funcionará si hay runmearchivos cuya ruta contenga caracteres de nueva línea.

información relacionada