csh: foreach의 출력을 리디렉션합니다.

csh: foreach의 출력을 리디렉션합니다.

foreachcsh에서: 루프에서 파이프로 출력을 리디렉션하는 방법은 무엇입니까 ?

이것은 작동하지만 임시 파일을 사용합니다.

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)/;'

관련 정보