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 '{}' ';'

これは、BSD 拡張 (最近では非常に一般的) をサポートしているcshと仮定しても、どのシェルでも機能します。find-execdir

それ実行するただし、ファイルを現在のシェル インスタンスにrunmeインポートするわけではありませんsource。いずれにしても、sourceを実行するには実行権限は必要ありません。

いずれにせよ、あなたのコードは有効な csh 構文ではありません。しかし、csh 構文をまだ知らない人にとっては朗報です。csh でのスクリプトは有害であり、実行すべきではないことは少なくとも 30 年間知られており、誰もあなたがそうすることを期待していないため、それを学ぶ必要はありません。

現在の作業ディレクトリが一時的にそのファイルの親であるときに、csh スクリプト内から csh ファイルを実行する必要があることが実際に判明した場合、コードは次のようになりsourceます。runme

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

runmeただし、パスに改行文字が含まれるファイルがある場合は機能しないことに注意してください。

関連情報