foreach
cshから:ループからパイプに出力をリダイレクトする方法は?
これは機能しますが、一時ファイルを使用します。
set tmpfile=/tmp/file
true > $tmpfile
foreach v (`set | awk -e '{print $1}' |grep -v prompt2`);
eval if'($?'$v' && ${#'$v'} <= 1) echo scalar'$v'="$'$v'"' >> $tmpfile
eval if'($?'$v' && ${#'$v'} > 1) echo array'$v'="$'$v'"' >> $tmpfile
end
cat $tmpfile | parallel --shellquote | perl -pe 's/^scalar(\S+).=/set $1=/ or s/^array(\S+).=(.*)/set $1=($2)/;'
一時ファイルを削除し、代わりにパイプを使用したいと思います。したがって、次のようなもの(動作しない):
( foreach v (`set | awk -e '{print $1}' |grep -v prompt2`);
eval if'($?'$v' && ${#'$v'} <= 1) echo scalar'$v'="$'$v'"'
eval if'($?'$v' && ${#'$v'} > 1) echo array'$v'="$'$v'"'
end ) | parallel --shellquote | perl -pe 's/^scalar(\S+).=/set $1=/ or s/^array(\S+).=(.*)/set $1=($2)/;'
答え1
Cシェルでは、制御構造へのパイプ接続はエラーです。制御構造の内部/外部パイピングの回避策は、スクリプトまたはFIFOファイルを生成することです。以下はサンプルファイルです。
echo '\
# Functions\
alias function '\''( set argv = ( \\\!* ) ; source ~/.cshfuncs )'\' >> ~/.cshrc
echo 'switch ("$1")\
case 'myfunc':\
shift\
foreach v (`set | awk -e '\''{print $1}'\'' |grep -v prompt2`)\
eval if'\''($?'\''$v'\'' && ${#'\''$v'\''} <= 1) echo scalar'\''$v'\''="$'\''$v'\''"'\''\
eval if'\''($?'\''$v'\'' && ${#'\''$v'\''} > 1) echo array'\''$v'\''="$'\''$v'\''"'\''\
end\
exit\
default:\
echo "Function $1 not set."\
exit\
endsw' > ~/.cshfuncs
これはFIFOの例です。
mkfifo ~/fifo
echo 'foreach v (`set | awk -e '\''{print $1}'\'' |grep -v prompt2`)\
eval if'\''($?'\''$v'\'' && ${#'\''$v'\''} <= 1) echo scalar'\''$v'\''="$'\''$v'\''"'\''\
eval if'\''($?'\''$v'\'' && ${#'\''$v'\''} > 1) echo array'\''$v'\''="$'\''$v'\''"'\''\
end' > ~/fifo & ( source ~/fifo ) | parallel --shellquote | perl -pe 's/^scalar(\S+).=/set $1=/ or s/^array(\S+).=(.*)/set $1=($2)/;'