이것을 구현하는 방법을 기억하지 못합니다. 사용자가 임시 사용을 위해 명령에 일반 텍스트를 포함할 수 있도록 지원하려고 합니다.
여기에서는 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
보시다시피 '
삭제되었습니다. 다른 쉘에서는 동작이 다르거나 스크립트가 실패할 수 있다고 가정합니다.