2017-12-19 37 views
1

간단한 JSON 파일 (여러 키/값 쌍을 가진 하나의 개체로 구성)을 업데이트하려고하는데 동일한 명령을 사용하고 있지만 다른 결과 (두 번째 명령으로 전체 json을 지우는 경우조차도)가 발생합니다. 내가 노력하고 명령은 다음과 같습니다JSON 값을 변경하기 위해 jq에서 동일한 구문을 사용하고 있습니다. 그러나 다른 하나는 bash 인터랙티브로 바꾼다.

cat ~/Desktop/config.json | jq '.Option = "klay 10"' | tee ~/Desktop/config.json 

이 명령은 완벽 "klay 10"내 의도 된 출력과 minerOptions 키의 값을 대체합니다.

그런 다음 새로 업데이트 된 파일에서 동일한 프로세스를 실행하려고합니다 (단 하나의 키에 대해 값이 변경됨). 결과가없는 대화식 터미널 만 가져옵니다. ps 불행히도 무슨 일이 일어나고 있는지 보여주는 데 도움이되지 않습니다. 이것은 내가 완벽하게 키의 값을 변경하는 첫 번째 명령을받은 후 할 것입니다 : 내가 마지막으로했던 것처럼, 할당 된 결과로 othOptions 키 값을 대체 할 것으로 예상했을 것이다

cat ~/Desktop/config.json | jq ‘.othOptions = "-epool etc-eu1.nanopool.org:14324 -ewal 0xc63c1e59c54ca935bd491ac68fe9a7f1139bdbc0 -mode 1"' | tee ~/Desktop/config.json 

. 나는 파일에 stdout을 직접 보내려고했지만 거기에는 아무런 결과도 없었다. 나는 한 번 더 파이핑을 시도하고 temp 파일을 만든 다음 원본으로 변경하기 위해 이동했습니다.이 모든 것은 동일한 동일한 명령과 반대되는 것으로, 단지 >을 반환하고 절대적으로 0 출력을 반환합니다. 내가 그 과정을 끝낼 때, 그것은 이전과 같은 가치이며 새로운 것이 아닙니다.

다른 입력과 함께 동일한 명령이 발생하는 이유는 무엇입니까? (두 번째 키는 바로 뒤에오고 동일한 구조를가집니다. 객체 또는 기타 키 - 쌍 쌍을 먼저 생성하지 않습니다.) 이 tee 될 수 있다고 생각하지만, 파일에 대한 표준 출력의 통과와 같은 다른 구현이 명령에 대한 사용자를 기다리고 같은 일정 >을 생산하고 있습니다.

나는 진정으로이 SE에 의지하기 전에 일이 될 수있는 이유는 온라인 모든 곳에서 내가 할 수있는 모습 , 그것은 내가 생각해야 할 것 같은 두통을 덜어 줄 것이다.

+0

첫째,'cat'에 대한 호출이 없습니다. 파일 이름만으로는 아무 것도하지 않을 것이고, 두 번째로'cat'을 사용하지 마십시오. 세 번째로, 명령에 왼쪽 따옴표를 사용했습니다 ... use 보통의 작은 따옴표. 그것은 작동하는 것과 거의 같은 "명령"입니다. –

+0

사실, [cat'의 쓸데없는 사용] (https://stackoverflow.com/questions/11710552/useless-use-of-cat)을 피하려고합니다. – tripleee

+0

동일한 파일을 파이프 라인에서 읽고 쓰는 것은 안전하지 않습니다. 파이프 라인의 모든 명령은 더 많거나 적게 동시에 실행되므로'cat'은 원래 내용을 읽는 것을 끝내거나 끝내지 않을 수도 있습니다. 꼬리는 새로운 내용을 준비하기 위해 비어 있습니다. 'jq'를 임시 파일로 출력 한 다음 오류를 확인한 다음 ('jq'가 성공적으로 종료 했습니까?) 오류가없는 경우 원본을 임시 파일로 바꿉니다. –

답변

1

@GordonDavisson은 지적했듯이 01을 사용했다. 입력 파일을 덮어 쓰는은 (잘 알려져 있습니다. jq FAQ) 재난을 대비하십시오. 당신이 절대적으로 긍정적으로 무조건 파일을 덮어 쓸 경우에, 당신은

jq ... config.json | sponge config.json 

나보다 안전하게으로, sponge 사용을 고려할 수 있습니다 이것과 다른 옵션, 검색에 대한 자세한 내용은

cp -p config.json config.json.bak && jq ... config.json | sponge config.json 

을 자주 묻는 질문 (FAQ)에서 '스폰지'를 찾으십시오.

+0

이 답장을 보내 주셔서 감사합니다 :) sponge는 매우 유용하지만 때때로 파일이 몇 줄의 jq 파이프 라인이 값을 변경 한 후에 완전히 지워지는 것 같습니다.내가하려는 것은 그 파일 내의 몇 개 키에 대한 값을 변경하는 것입니다. 단 하나의 키만 덮어 쓰지 않는 한 반드시 덮어 쓰지 않아도됩니다. 값을 변경하여 새 파일이되는 것이 더 좋고, 더 안전한 방법이 있습니까? –

+0

다른 파일에 쓰고 모든 대용 입력이 완료되면 원본 파일을 대체 파일로 바꿉니다. 다중 교체를 수행하기 위해 여러 프로세스를 실행하는 것은 나쁜 생각이지만 데이터 손실은 좋지 않으며 비효율적이며 추악하지는 않습니다. – tripleee