'터칭' 기준이 공개됐다?

'터칭' 기준이 공개됐다?

이것은 이상한 질문처럼 보일 수 있지만 다음과 같은 파일에 출력이 기록되는 스크립트가 있다고 가정해 보겠습니다.

myscript.sh >> /path/to/some/file

실제로 아무것도 쓰지 않고도 출력 파일의 수정 시간을 업데이트할 수 있도록 표준 출력을 "터치"하는 것이 가능합니까?

분명히 경로가 스크립트에 직접 전달된 경우 명령을 사용하여 이 작업을 쉽게 수행할 수 있지만 touch여기서는 그렇지 않습니다. 대신 표준 출력을 파일로 리디렉션합니다.

그렇다면 I/O 리디렉션을 사용할 때 대상 파일에 도달하는 영리한 방법이 있습니까? 아니면 내부적으로 또는 일종의 래퍼 스크립트 내에서 출력 경로를 처리해야 합니까?

답변1

적어도 Linux에는 파일에 대한 /dev/stdout심볼릭 링크가 있으므로 다음과 같이 작동합니다./proc/self/fd/1touch /dev/stdout

user@host:~$ ( echo hi; stat -c '%y' /tmp/foo >&2; for i in 0 1 2; do sleep 2; touch /dev/stdout; stat -c '%y' /tmp/foo >&2; done ) >> /tmp/foo
2017-11-03 07:02:59.595622835 -0400
2017-11-03 07:03:01.599680859 -0400
2017-11-03 07:03:03.603738883 -0400
2017-11-03 07:03:05.611797023 -0400

Linux에서 stdout이 파일이 아닌 경우 성공하거나 아무 작업도 수행하지 않습니다. 예를 들어 익명 파이프에는 ./myscript.sh | less실제로 mtime이 있지만 소켓의 mtime은 항상 0입니다. stdout이 열려 있지 않으면(드물지만 가능함) 진단 메시지("내 컴퓨터에 해당 파일이나 디렉터리가 없습니다")가 생성됩니다. stdout이 쓰기 불가능한 파일인 경우에도 마찬가지입니다.

전혀 이식성이 없지만 최악의 경우 진단을 생성하고 아무 작업도 수행하지 않을 수 있습니다(적어도 쓸 수 없는 루트가 아닌 사용자의 경우 /dev).

실제 목표에 따라 더 나은 방법이 있을 수 있습니다. 예를 들어 파일 이름을 스크립트에 전달하면 touch직접 사용하는 것이 간단할 수 있습니다. 또는 "살아있다!"라고 말하기 위해 이를 수행하는 경우 별도의 파일이 필요할 수 있습니다(또는 프로세스 관리자 및/또는 pid 파일 사용).

답변2

futimes()호출 / futimens()시스템 호출이 필요합니다 .

를 사용하면 perl다음을 통해 호출할 수 있습니다.

perl -e 'utime undef, undef, *STDOUT'

관련 정보