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
//を使用できますzsh
。ksh
source
source ./file
(追加が重要です。そうしないと、./
現在のディレクトリにあるものを考慮する前にinsource
を探しますfile
。POSIXモードでは、inが見つからなくても現在のディレクトリは考慮されません。)$PATH
file
bash
file
$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
使用してください。awk
perl
// 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
(私はこれが古い質問であることを知っています。)