전역 파일 이름으로 리디렉션하지 못했습니다.

전역 파일 이름으로 리디렉션하지 못했습니다.

저는 Ubuntu 16.04(xenial)에서 Bash 4.3.48(1) 및 LEMP 스택을 사용하고 있습니다.

php.ini버전 독립적인 방식으로 사용 하려고 합니다 printf.

1)버전 독립적인 작업이 실패했습니다.

printf "[PHP]\n post_max_size = 200M\n upload_max_filesize = 200M\n cgi.fix_pathinfo = 0" > /etc/php/*/fpm/zz_overrides.ini

다음과 같은 오류가 발생합니다.

bash: /etc/php/*/zz_overrides.ini: 해당 파일이나 디렉터리가 없습니다.

2)버전 영지적 작업이 성공했습니다.

printf "[PHP]\n post_max_size = 200M\n upload_max_filesize = 200M\n cgi.fix_pathinfo = 0" > /etc/php/7.0/fpm/zz_overrides.ini

*보시다시피 둘 다 기본적으로 7.0vs. vs.

  • .NET에서 이 (정규식?) 문제에 대한 단서를 찾지 못했습니다 man printf.
  • Google에서 검색했는데 "printf에서 정규식 허용"에 대한 내용을 찾지 못했습니다.

버전 독립적인 작업이 실패하고 우회하는 이유는 무엇입니까?

편집: 나에게 가장 중요한 것은 가능하면 한 줄 작업을 사용하는 것입니다.

답변1

리디렉션의 패턴 일치 동작은 쉘마다 다른 것 같습니다. 내 시스템에서는 dash 및 ksh93이 패턴을 확장하지 않으므로 리터럴 filename 을 얻습니다 *. Bash는 이를 확장합니다 (1) . 단, 패턴이 파일과 일치하는 경우에만 해당됩니다. 일치하는 파일 이름이 더 있으면 오류가 발생합니다. Zsh는 여러 리디렉션을 제공하는 것처럼 작동하며 출력을 다음으로 리디렉션합니다.모두파일을 일치시킵니다.

(1) 비대화형 및 POSIX 모드인 경우 제외

일치하는 모든 파일을 출력하려면 다음을 사용할 수 있습니다 tee.

echo ... | tee /path/*/file > /dev/null

하나의 파일에만 액세스하려면 어떤 파일을 사용할지 결정하는 것이 문제입니다. 하나의 파일만 패턴과 일치하는지 확인하려면 전체 목록을 확장하여 개수를 계산하세요.

Bash/ksh에서:

names=(/path/*/file)
if [ "${#names[@]}" -gt 1 ] ; then
    echo "there's more than one"
else
    echo "there's only one: ${names[0]}"
fi

표준 쉘에서는 set위치 매개변수가 계산에 사용됩니다 $#.


물론, 패턴이 어떤 파일과도 일치하지 않으면 그대로 남게 되고, glob이 중간에 있으므로 결과는 존재하지 않는 디렉토리를 가리킨다. 이는 존재하기 전에 생성하려고 시도하는 것과 /path/to/file동일합니다 /path/to. 여기서는 /path/*대신 별표를 사용합니다.

이 문제를 해결하려면 파일 이름 없이 디렉터리 이름을 확장한 다음 모든 디렉터리에 파일 이름을 추가해야 합니다. 이건 좀 별로다...

dirs=(/path/*)
files=( "${dirs[@]/%/\/file}" )

그런 다음 이 배열을 사용할 수 있습니다.

echo ... | tee "${files[@]}" > /dev/null

또는 간단한 접근 방식을 취하고 파일 이름 패턴을 반복할 수 있습니다. 보다 일반적인 경우에는 각 출력 파일에 대해 기본 명령을 한 번 실행하거나 임시 파일을 사용하여 출력을 저장해야 하기 때문에 이는 다소 만족스럽지 않습니다.

for dir in /path/* ; do
    echo ... > "$dir/file"
done 

관련 정보