Quero navegar para o subdiretório onde existe o arquivo necessário? usando script CSH

Quero navegar para o subdiretório onde existe o arquivo necessário? usando script CSH
if(-f runme ) then
    cd `dirname $(find . -iname 'runme')`
    chmod +x runme
    source runme
    cd -

ISSO É VERDADEIRO NO SCRIPT CSH?

Primeiro, ele procurará o arquivo runme recursivamente em todos os subdiretórios e, se estiver presente, irá para o subdiretório onde esse arquivo existe?

Esta é a questão - minha lógica está correta sintaticamente? Acho que o código atual irá pesquisar o arquivo runme no diretório atual.

Eu encontrei uma solução, então pensei em compartilhá-la abaixo. Eu também mencionei em uma seção de comentários.

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 -

Responder1

Não há nenhuma boa razão para usar cshneste século.

Aqui, porém, eu faria:

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

O que funcionaria em qualquer shell, mesmo cshassumindo que você findsuporte a -execdirextensão BSD (muito comum hoje em dia).

Queexecutaos runmearquivos, mas isso não acontece sourcena instância atual do shell. De qualquer forma, sourceing não requer permissão de execução.

De qualquer forma, não, seu código não tem sintaxe csh válida. Mas a boa notícia, se você ainda não conhece a sintaxe do csh, é que não precisa aprendê-la, porque é sabido há pelo menos 3 décadas que scripts em csh são prejudiciais e não devem ser feitos, então ninguém deveria ser esperando que você faça isso.

Se você realmente precisasse de sourceum runmearquivo csh dentro de um script csh enquanto o diretório de trabalho atual é temporariamente o pai desse arquivo, o código seria mais parecido com:

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

Porém, observe que não funcionará se houver runmearquivos cujo caminho contenha caracteres de nova linha.

informação relacionada