내가 만든 기록의 마지막 10줄을 삭제하는 bash 스크립트를 만들고 싶지만 여전히 오류가 발생합니다.
#!/bin/bash
i= history | wc -1
j= $i-10
for x in {$i..$j}
do
history -d $x
done
무엇이 잘못되었는지 알 수 없습니다. 어떤 생각이 드나요?
답변1
몇 가지 오류가 있습니다.
나= 역사 | 화장실 -1
여기에 공백이 있으므로 오류를 방지하려면 이를 ""로 묶어야 하며, 등호 뒤에 불필요한 공백을 추가했습니다. 그러나 여러분이 한 일은 "history | wc -1"을 포함하는 변수를 생성한 것뿐입니다. 첫째, "wc -1"이 없습니다. 줄 수를 세는 "wc -l"을 의미했다고 생각합니다. 둘째, 실제로 이 명령을 실행하고 싶었다고 생각합니다.
다음을 사용할 수 있습니다.
i=$(역사 | 화장실 -l)
그러나 서브쉘에 있기 때문에 결과는 항상 0이 됩니다.
j= $i-10
등호 뒤에 공백을 추가했습니다. "j=$i-10"을 사용할 수 있지만 실제로는 계산이 수행되지 않습니다.
다음과 같이 시도해 보세요:
j=$(echo "${i}-10" | bc -l)
i가 10 이하인 시나리오를 처리하기 위해 if 문을 작성하고 싶을 수도 있습니다.
다음과 같이 시도해 보세요:
if [[ "$i" -lt "11" ]]; 그러면 j="1"; fi
{$i..$j}의 x에 대해
여기서는 변수를 사용할 수 없습니다. 결과는 숫자 목록 대신 #..#이 됩니다. 변수에 반영되는 do done 문에 대한 한 줄짜리 문을 만든 다음 eval을 사용하여 실제로 실행하면 이 문제를 해결할 수 있습니다. 이런 식으로 $i와 $j는 명령이 실행될 때 이미 실제 숫자로 대체됩니다.
궁극적으로그렇지만,전체 접근 방식은 의미가 없습니다, 쉘 스크립트에서 History 명령을 실행하면 서브쉘에 있고 서브쉘은 해당 기록을 보고하지 않기 때문에 카운트 결과로 0을 얻게 되기 때문입니다. 무슨 뜻인지 확인하려면 여러 명령을 실행한 후 다음 스크립트를 실행하세요.
#!/bin/bash 역사 | 화장실 -l
보시다시피 결과는 0입니다. 왜일까요? 서브쉘의 기록이고 서브쉘은 기록을 보고하지 않기 때문입니다. History 명령 이전에 스크립트에 다른 명령을 추가해도 결과는 0이 됩니다.
다시 시작하다. 히스토리 파일을 직접 편집해 보세요.@kos가 제안한대로. 현재 셸의 명령은 셸이 종료될 때까지 파일에 기록되지 않습니다.
행운을 빌어요.