두 개의 Ubuntu 설치가 있습니다.
ㅏ:14.04.3 LTS (GNU/Linux 3.13.0-77-generic x86_64)
두번째:14.04.2 LTS (GNU/Linux 3.13.0-61-generic x86_64)
다음 명령을 실행하고 있습니다.
find . -name "nosuch.file" -print0 | xargs -0 ls
(실제 명령은 더 복잡하지만 이 정도로 범위를 좁혔습니다.) nosuch.file
현재 디렉터리나 하위 디렉터리에 파일이 없습니다.
서버 A에서 이 명령은 예상한 대로 빈 출력을 생성합니다.
서버 B에서 이 명령은 현재 디렉터리(명령을 실행 중인 디렉터리) 목록을 생성합니다.
두 서버 모두에서 실행하면 find . -name "nosuch.file" -print0
빈 출력이 생성됩니다.
두 서버 모두에 동일한 버전이 설치되어 있습니다 find
.xargs
ls
$ find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0)
$ xargs --version
xargs (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
$ ls --version
ls (GNU coreutils) 8.21
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Richard M. Stallman and David MacKenzie.
명령이 다르게 동작하는 이유는 무엇입니까? 서버 A에서와 같이 일관된 동작을 달성하려면 어떻게 해야 합니까(파일을 찾을 수 없으면 빈 출력)?
답변1
"서버 A에서와 같이 일관된 동작을 달성하려면 어떻게 해야 합니까(파일을 찾을 수 없는 경우 빈 출력)?"
이 동작을 수행하려면 / 옵션을 사용하여 지정된 명령이 파일 이름을 전달하지 않고 실행되지 않도록 xargs
할 수 있습니다 . ~에서-r
--no-run-if-empty
매뉴얼 페이지:
표준 입력에 공백이 아닌 항목이 없으면 명령을 실행하지 마십시오. 일반적으로 명령은 입력이 없더라도 한 번만 실행됩니다.
이 옵션은 GNU 기능 xargs
이며 표준이 아닙니다. 즉, POSIX에서 지정합니다.