eval はパイプコマンドとともに使用されます。

eval はパイプコマンドとともに使用されます。

1行に保存されたコマンドを含むfile.txtがあり(コマンドはコンソールで実行されたときに機能します)、shを使用して1行で実行したいと思います。

cat file.txt | eval

なくなったものありますか?どんな提案がありますか?

私のファイルに多くのコマンド(1行に1つずつ)が含まれていて、1つのコマンド(フル行)だけを実行したい場合はどうすればよいですか?私の最初の考えは次のとおりです。

head -n5 | tail -n1 | eval

答え1

eval標準入力から対応するコマンド文字列を読みません。

eval "$(cat file.txt)"
# or easier, in ksh/bash/zsh
eval "$(<file.txt)"
# usually you cannot be sure that a command ends at the end of line 5
eval "$(head -n 5 file.txt)"

代わりに、コマンドがファイルにある場合は、eval標準.またはbash//を使用できますzshksh source

source ./file

(追加が重要です。そうしないと、./現在のディレクトリにあるものを考慮する前にinsourceを探しますfile。POSIXモードでは、inが見つからなくても現在のディレクトリは考慮されません。)$PATHfilebashfile$PATH

もちろん、ファイルの一部を選択しても機能しません。これは次の方法で行うことができます。

head -n 5 file.txt >commands.tmp
source ./commands.tmp

または(ksh93、zsh、bashを使用):

source <(head -n 5 file.txt)

答え2

したがって、問題に対する解決策は100%可能であり(の文脈でmake)重要です。

私はmakefileでこの問題に遭遇し、すでにVariablesを呼び出すために使用されているmakefileにbashコマンドを入れ子にするのが難しいことを考えると、あなたが望むことを$(...)正確に実行できれば良いでしょう。

そうでない場合は、orシステムコマンドをeval使用してください。awkperl

// command_list.sh:
echo "1"
echo "2"
echo "3"

// command line prompt:
$: cat command_list.sh | awk '{system($0)}'
1
2 
3

そして、命令の建物は次のとおりです。

// a readable version--rather than building up an awk miniprogram, 
// split into logical blocks:

$: cat inputs.txt | awk '{print "building "$1" command "$2" here "}' | awk '{system($0)}' 

答え3

技術的に、パイプから何かを読み取ろうとすると、パイプ内の各コマンドは別々のプロセスとして実行されるため、現在の環境で何かを評価することは不可能です。

しかし、達成しようとする目標によっては、これは重要ではないかもしれません。とにかく、evalパイプラインの内容に対して実行された内容は次のとおりです。

❯ echo echo hi | eval "$(cat -)"
hi

キャプチャした例です。次の内容は印刷されません1

❯ echo a=1 | eval "$(cat -)"; echo $a

私たちは次のことを行う必要があります。

❯ echo a=1 | { eval "$(cat -)"; echo $a; }
1

答え4

何をすべきかわからない場合は、eval以下を使用してくださいsh

cat file.txt | sh

はい、別のshインスタンスで実行されますが、その事実は独自に文書化されています。

さらにwhile read:

cat file.txt | while read cmd; do eval $cmd; done

file.txtの5行目でコマンドを実行します。

sed -n 5p file.txt | sh

(私はこれが古い質問であることを知っています。)

関連情報