시뮬레이션된 파일의 교체 프로세스

시뮬레이션된 파일의 교체 프로세스

이것을 구현하는 방법을 기억하지 못합니다. 사용자가 임시 사용을 위해 명령에 일반 텍스트를 포함할 수 있도록 지원하려고 합니다.

여기에서는 file.json 파일에서 읽습니다.

lp_solve --method='simplex' --problem='<file.json>'

하지만 사용자가 프로세스 대체를 사용하여 json 인라인을 작성할 수 있기를 바랍니다.

lp_solve --method='exhaustive' --problem=<(echo '
   {"foo":"bar","this":"is json"}
')
 

크로스 플랫폼이 될 수 있나요? "<()" 주위에 따옴표가 필요합니까?

답변1

쉘이 bash, zsh 또는 ksh93의 최신 버전이고 빌드 시 이 기능이 비활성화되지 않았다고 가정하면,

lp_solve --method='simplex' --problem=<(echo 'something')

파이프의 읽기 끝을 식별하는 마지막 lp_solve인수로 호출됩니다 . 원래 ksh 구현, 명명된 파이프 또는 .--problem=/path/to/some/file/path/to/some/file/dev/fd/n/proc/self/fd/n

다른 쉘은 프로세스 대체를 지원하지 않거나 다른 구문( <{cmd}rc와 유사한 쉘에서 (cmd | psub)in fish) 및/또는 <(cmd)다른 목적(예: 프로세스 리디렉션 yash또는 <리디렉션 후 명령 대체 fish) 을 사용하여 이를 지원합니다.

파일이 파이프라는 사실에는 여러 가지 의미가 있습니다. 즉, 일반 파일에 대한 일대일 교체로 항상 사용할 수는 없습니다.

  • 응용프로그램(여기 lp_solve)이 파일 내에서 찾을 수 없습니다.
  • 한 번 읽은 후 응용 프로그램에서 다시 열면 비어 있는 것으로 나타납니다.
  • 파일에 쓰려는 시도가 실패하거나 예상대로 작동하지 않습니다.

zsh 및 Fish에는 임시 일반 파일을 사용하는 프로세스 교체 형식이 있습니다.

  • ... --problem==(echo '...')(zsh)
  • ... --problem=(echo '...' | psub -f)(물고기)

"$(echo ... | psub)"최신 버전을 제외하면 fish따옴표 안에 프로세스 교체가 수행되지 않으므로 다음을 수행할 수 있습니다.아니요주변에 따옴표를 사용하고 싶습니다.

Bash에서도 임의의 텍스트, 특히 문자가 포함된 텍스트(json에서 일반적) echo에는 이식성이 없다는 점을 명심하세요 . \을 사용하고 싶을 수도 있습니다 printf.

--problem파일을 매개변수로 사용하는 것 외에도 json 문자열을 매개변수로 사용하는 것도 있을 수 있습니다. 좋아요 --problem-file=file.json--problem='{"some": "json"}'. 또는 json 문자열은 로 시작할 수 없으므로 @일부 curl옵션 및 has 및 와 --problem='{"some": "json"}'유사한 작업을 수행합니다 [email protected].


1개의 프로세스 교체는 80년대 중반 ksh에서 이루어졌지만 /dev/fd/n지원되는 시스템에서만 사용할 수 있으며 확장은 매개변수의 일부가 될 수 없습니다. --problem <(cmd)작동했지만 작동하지 않습니다 --problem=<(cmd)(비교적 새로운 ksh93 버전까지는 여전히 작동합니다).

configure² Bash에서 --disable-process-substitution스크립트를 사용하거나 호출하는 경우 프로세스 교체를 비활성화합니다.--enable-minimal-config

답변2

노트

나는 lp_solve이것이수학프로그램이므로 아래 코드는 원하는 방식으로 작동하지 않습니다. 이는 프로그램에 경로 이름이 필요하기 때문입니다.


프로세스 대체를 사용할 때는 표준 입력에서 스크립트에 전달되는 내용을 읽어야 합니다(파이프와 같다고 생각합니다).

이제 lp_solve사용자 정의 프로그래밍/셸 스크립트(예: bash)인 경우 다음을 사용하여 표준 입력을 읽어야 합니다.

#!/usr/bin/bash
echo Data:
cat

통과하려면 다음 stdin을 사용해야 합니다.

lp_solve --method='simplex' --problem=< <(echo Fuzz)
#Output:
Data:
Fuzz

그러나 위에서 볼 수 있듯이 매개변수가 아닌 매개변수로 < <(echo Fuzz)취급되므로 stdin어떤 변수도 읽을 수 없습니다 $N.

스크립트에 매개변수로 전달하려면 다음을 사용해야 합니다.

lp_solve --method='simplex' --problem='
{"foo":"bar","this":"is json"}
{"foo":"buzz","this":"is json"}
{"foo":"foo","this":"is json"}
etc...
'

입력할 때 lp_solve --method='simplex' --problem='Enter를 눌러야 합니다.충분히당신의 문자열. 그런데, 문자열을 입력하면 완료되므로
사용할 때 주의하세요 . 예를 들어:--problem=''

lp_solve --method='simplex' --problem='
this is a text
this is a'text
#Output:
this is a text
this is atext

보시다시피 '삭제되었습니다. 다른 쉘에서는 동작이 다르거나 스크립트가 실패할 수 있다고 가정합니다.

관련 정보