2013-10-01 5 views
22

내 파일과 그들 모두의 특정 작업을 수행하려는,의 내가 모든 파일의 이름을 변경하고 싶습니다 가정 해 봅시다 : 이것은 잘 작동명령을 실행하지 않고 명령을 표시하십시오.

for file in $(ls); do mv "$file" "${file}_new"; done 

. 그러나이 명령을 호출하기 전에, 나는 그것이 실제로 무엇을보고 싶어요, 그래서 나는 그 다음 나에게 그것을 호출하는 모든 명령을 보여줍니다

for file in $(ls); do echo mv "$file" "${file}_new"; done 

에 에코를 추가합니다. 내가 그 (것)들과 행복하다면, 나는 echo을 제거하고 그것을 실행한다.

그러나 명령이 파이프 또는 하나 이상의 명령을 포함하여 약간 더 미묘한 경우 더 이상 작동하지 않습니다. 물론 '을 사용할 수 있으므로 특수 문자는 해석되지 않지만 매개 변수 확장이 없습니다. 나는 또한 특수 문자를 피할 수 있지만 이것은 매우 지루할 것이다.

내 질문은 무엇이 최선의 방법인가요? 나는 -n 옵션에 대해 man bash을 읽었습니다. "명령을 읽되 실행하지는 않습니다."이것은 쉘 스크립트에서 구문 오류를 검사하는 데 사용될 수 있습니다. 이것은 대화식 쉘에서 무시됩니다. " 이것이 내가 원하는 것인데 대화식 쉘을 위해 필요하다. -x 또는 -v 옵션은 명령을 보여줄뿐만 아니라 호출하기 때문에 너무 늦은 것 같습니다. 옵션을 대신 실행 명령을 보여 왜

+1

기술적으로, 그것을 달성 할 수있는 방법이 없습니다. – devnull

+0

또는 각 별칭을 별칭 = 'bash -c ""''와 같은 별칭으로 * 별표 *로 지정할 수 있으므로 매개 변수가 허용되지만 아무 것도 실행되지 않습니다. * alias-emptifier * 루프를 실행하고 원하는 프로세스를 실행 한 다음 나중에 해당 기능을 복원하는 * 별칭 복원 * 명령을 실행할 수 있습니다. – Rubens

+2

그건 그렇고,'for $ (ls)'에'for file '을 사용하는 것은 정당한 이유없이 자식 (프로세스)을 희생하고 있습니다. 왜 'for file in'을 사용하지 않겠습니까? – cdarke

답변

21

This 스레드가 당신을 말할 것이다 그 (드라이 런이 a.k.a) bash 구현되지 않을 것입니다.

Eric Blake에서 응답을 참조하십시오 : 이러한 옵션 또는 제공 할 수없는 이유

> 내 질문은,이 구현되지 않습니다 이유

약간의 생각이 보여줄 것입니다. 무엇 것 다음에 대한 이러한 옵션 출력 :

$foo args의 줄에
if complex_command; then 
    foo=command1 
else 
    foo=command2 
fi 
$foo args 

, $foo가 이전에 실행하지 않은 경우 (단지 스캔하지 않음)로 확장 무엇 complex_command를 알 수있는 방법이 없습니다. 따라서 드라이 클리닝 할 수있는 방법은 없습니다. 최종 결과는 실행하지 않고 의 결과가되지만, 실행중인 드라이는 드라이 런의 목표에 카운터 입니다.

당신은 당신이 할 수있는 디버거 인터페이스를 제공하기 위해 bash는 후크를 사용하는 bashdb 프로젝트에 관심이있을 수 말했다 즉, 한 단계 떠들썩한 파티 스크립트를 통해 ; 스크립트가 수행 할 작업을 알려주는 것과 같지 않지만 적어도 실제로 스크립트가 얼마나 많이 또는 적게 실행되는지 제어 할 수 있습니다.

16

explained by devnull로 "드라이 런 '에 대한 옵션은 없습니다하지만 간단한 해결 방법은 : 당신은 (아무것도 변경하지 않고) 두 번째 과제에서 주석을 제거하면

debug= 
#debug=echo 

$debug mv "$file" "${file}_new" 

하면, 활성화가" 드라이 런 "으로 위험한 mv 명령을 실행합니다.

더 정교한 접근 방식 (명령 행 옵션과 같은) 어떤 조건을 확인하는 것입니다 :

debug= 
if [[ ...enable dry run?... ]]; then 
    debug=echo 
fi 

참고 : -u ("는 등의 설정되지 않은 변수를 치료 옵션이있을 때 빈 할당에만 필요 대체 할 때 오류가 발생했습니다. ") enabled.

+0

디버깅을 이니셜 설정으로 되돌리려면 어떤 설정이 필요합니까? 추신 : 내 bash에서 디버그를 사용할 수없는 이유가 있습니다. –

+1

@GeorgeVasiliou'debug'는 아무 것도 지정하지 않은 변수 나 그냥 인자 ('echo')를 출력하는 명령입니다. 효과를 되돌리려면, 아무것도 다시 할당하지 말기 만하면됩니다 :'debug ='. –

+0

리디렉션을 사용하면이 기능이 작동하지 않습니다. –

6

가 여기에, 어쩌면라는 github 패키지 예입니다 :

$ maybe rm file 
> maybe has prevented rm file from performing 1 file system operations: 
> 
> delete /home/user/file 
> 
> Do you want to rerun rm file and permit these operations? [y/N] 
관련 문제