Я хочу перейти в подкаталог, где находится требуемый файл, используя скрипт CSH

Я хочу перейти в подкаталог, где находится требуемый файл, используя скрипт CSH
if(-f runme ) then
    cd `dirname $(find . -iname 'runme')`
    chmod +x runme
    source runme
    cd -

ПРАВДА ЛИ ЭТО В СКРИПТЕ CSH?

Сначала он будет рекурсивно искать файл runme во всех подкаталогах, и если он там есть, то перейдет в тот подкаталог, где этот файл находится?

Вот в чем вопрос - верна ли моя логика синтаксически? Я думаю, что текущий код будет искать файл runme в текущем каталоге.

Я нашел решение, поэтому решил поделиться им ниже. Я также упомянул об этом в разделе комментариев.

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 -

решение1

cshВ этом столетии нет никаких веских причин употреблять его .

Но здесь я бы сделал следующее:

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

Что будет работать в любой оболочке, даже cshесли вы findподдерживаете -execdirрасширение BSD (очень распространенное в наши дни).

Чтовыполняетфайлы , но в текущем экземпляре оболочки их runmeнет . В любом случае, ing не требует разрешения на выполнение.sourcesource

В любом случае, нет, ваш код не является допустимым синтаксисом csh. Но хорошая новость, если вы пока не знаете синтаксис csh, заключается в том, что вам не нужно его изучать, поскольку уже как минимум 3 десятилетия известно, что скриптование в csh вредно и не должно выполняться, так что никто не должен ожидать, что вы будете это делать.

Если вам действительно нужно получить доступ к sourcecsh runme-файлу из csh-скрипта, в то время как текущий рабочий каталог временно является родительским для этого файла, код будет выглядеть примерно так:

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

Однако следует отметить, что это не сработает, если есть runmeфайлы, путь к которым содержит символы новой строки.

Связанный контент