2012-10-03 3 views
1

나는 파일의 목록을 기반으로 명령을 빌드하는 bash 스크립트를 사용하므로 명령은 즉시 작성됩니다. 즉석에서 빌드하면 변수에 저장됩니다. 그런 다음 해당 명령을 실행하고 별도의 변수에 출력을 저장하려고합니다. 명령 대체를 사용하여 명령을 시도하면 명령이 실행되지 않습니다. 변수가 파이프를 사용하는 경우 변수에서 명령을 사용하여 명령 대체를 수행하려면 어떻게해야합니까? 나는 그 프로그램을 실행하면변수를 사용한 배쉬 명령어 대체

# Finds number of files that are over 365 days old 

ignored_files=('file1' 'file2' 'file3') 
path_to_examine="/tmp/" 
newer_than=365 

cmd="find $path_to_examine -mtime -$newer_than" 
for file in "${ignored_files[@]}"; do 
    cmd="$cmd | grep -v \"$file\"" 
done 
cmd="$cmd | wc -l" 
echo "Running: $cmd" 
num_active_files=`$cmd` 
echo "num files modified less than $newer_than days ago: $num_active_files" 

출력 : : 그 cmd를 실행하면

# ./test2.sh 
Running: find /tmp/ -mtime -365 | grep -v "file1" | grep -v "file2" | grep -v "file3" | wc -l 
find: bad option | 
find: [-H | -L] path-list predicate-list 
# 

출력 :

# num=`find /tmp/ -mtime -365 | grep -v "file1" | grep -v "file2" | grep -v "file3" | wc -l` 
# echo $num 
10 
# 
+3

이로 인해'|'주위에 따옴표가 생깁니다. 그래서 실제로 실행하려고하는 명령은'find/tmp/-mtime -365 '|'입니다. grep -v ' "file1"' '|' grep -v ' "file2"' '|' grep -v ' "file3"' '|' 머리 '|' wc -l'. 파일의 맨 위에'#!/bin/bash -x'를 추가하면 이것을 볼 수 있습니다. – user650654

답변

4

당신은 eval 명령을 사용해야합니다 여기

내 스크립트입니다 :

num_active_files=`eval $var` 

이렇게하면 bash가 동적으로 실행될 표현식을 생성 할 수 있습니다.

호프가 도움이 됨 =)