바로가기 Alt- c(bash)

바로가기 Alt- c(bash)

때로는 수학 연산을 실행해야 할 때도 있습니다. bc또는 을 사용할 수 있다는 것을 알고 있습니다 echo $(( 6/2 )). bc입력을 읽는 함수를 직접 만들었습니다 . 하지만 때로는 입력하는 데 시간이 오래 걸립니다 _bc "6/2". 그래서 저는 이런 질문을 가지고 있습니다:

명령줄에서 숫자에 대해 수학을 실행하는 방법을 zsh/bash에 가르칠 수 있는 방법이 있나요? 하나의 예는 천 마디 말만큼의 가치가 있습니다.

$ 6/2
$ 3.0

즉, zsh/bash는 숫자를 인식하고 호출해야 함을 의미합니다.기원전.

답변1

바로가기 Alt- c(bash)

bash에서는 readline 유틸리티를 사용하여 단어를 calc시작 부분에 두고 지금까지 작성된 텍스트를 큰따옴표로 묶는 키 시퀀스를 정의할 수 있습니다.

 bind '"\ec": "\C-acalc \"\e[F\""'

23 + 46 * 89실행 후 예를 들어 다음 Altc얻으려면 다음을 입력하십시오 .

 calc "23 + 46 * 89"

Enter 키를 누르면 수학 연산이 calc로 정의된 함수에 의해 수행됩니다. 이는 간단할 수도 있고 훨씬 더 복잡할 수도 있습니다.

 calc () { <<<"$*" bc -l; }

(+) 별칭

별칭을 정의할 수 있습니다.

alias +='calc #'

그러면 지금까지 입력한 전체 명령줄이 주석 처리됩니다. 다음을 입력합니다:

 + (56 * 23 + 26) / 17

Enter 키를 누르면 해당 줄이 번역되고 calc #(56 * 23 + 26) / 17명령이 호출됩니다. calccalc가 이 함수인 경우:

 calc(){ s=$(HISTTIMEFORMAT='' history 1);   # recover last command line.
         s=${s#*[ ]};                        # remove initial spaces.
         s=${s#*[0-9]};                      # remove history line number.
         s=${s#*[ ]+};                       # remove more spaces.
         eval 'bc -l <<<"'"$s"'"';           # calculate the line.
       }

 calc(){ s=$(history -1 |                          # last command(s)
             sed '$!d;s/^[ \t]*[0-9]*[ \t]*+ //'); # clean it up 
                                                   # (assume one line commads)
         eval 'bc -l <<<"'"$s"'"';                 # Do the math.
       }

+zsh는 별칭이나 문자를 허용하지 않습니다 #.

값은 다음과 같이 인쇄됩니다.

 $ + (56 * 23 + 26) / 17
 77.29411764705882352941

문자열로 인용된 a 만 +필수이며(와일드카드 없음), 쉘 변수를 허용합니다.

 $ a=23
 $ + (56 * 23 + $a) / 17
 77.11764705882352941176

(+) 기능

몇 가지 제한 사항이 있으므로 다음은 (bash에서) 함수를 사용하여 귀하의 요청에 가장 가까운 것입니다.

+() { bc -l <<< "$*"; }

다음과 같이 작동합니다.

$ + 25+68+8/24
93.33333333333333333333

문제는 쉘 구문 분석을 피할 수 있는 방법이 없으며 a *(예를 들어)가 pwd의 파일 목록으로 확장될 수 있다는 것입니다.

공백 없이 명령줄을 작성하면 아마 괜찮을 것입니다.

이런 내용은 $(...)확장되므로 쓰지 않도록 주의하세요.

안전한 해결책은 평가할 문자열을 인용하는 것입니다.

$ + '45 + (58+3 * l(23))/7'
54.62949752111249272462

$ + '4 * a(1) * 2'
6.28318530717958647688

그것은 단지문자는 당신보다 짧지 _bc "6/2"+나에게는 a가 더 직관적인 것 같습니다.

답변2

에서는 zsh다음을 수행할 수 있습니다.

autoload zcalc
accept-line() {
  if [[ $BUFFER =~ '^[ (]*[+-]? *(0[xX]|.)?[[:digit:]]+[^[:alnum:]]' ]]; then
    echo
    zcalc -e $BUFFER
    print -rs -- $BUFFER
    BUFFER=
  fi
  zle .$WIDGET
}
zle -N accept-line

accept-line위젯(에 매핑됨 Enter)을 현재 줄이 숫자(10진수 또는 16진수)로 시작하는지 확인하는 사용자 정의 위젯으로 재정의 합니다 . 선택적으로 다음 과 같은 명령 (에 대한 거짓 긍정을 피하기 위해 숫자가 아닌 문자 찾기 뒤에 임의의 숫자 s가 앞에 붙습니다. 7zip또는 411toppm.

일치하는 항목이 있으면 이를 전달하고 zcalc(쉘 변수와 모든 zsh 수학 함수 및 숫자 스타일을 사용할 수 있지만 임의의 정밀도를 지원하지 않으므로 bc보다 유용함) 기록에 행을 추가하고 빈 명령을 수락합니다. .

다음과 같이 숫자가 포함된 줄을 입력하면 혼동이 발생할 수 있습니다.

cat << EOF
213 whatever
EOF

또는:

var=(
  123 456
)

답변3

나는 bash의 변형을 사용합니다매직 앨리어스 크랙:

asis() { bc <<< "$(history 1 | perl -pe 's/^ *[0-9]+ +[^ ]+ //')"; }
alias c='asis #'

그 다음에:

$ c 1+1
2
$ c -10 + 20 / 5
-6
$ c (-10 + 20) / 5
2
$ c 2^8 / 13
19
$ c scale=5; 2^8 / 13
19.69230

마술은 별칭 확장이 발생한다는 것입니다.앞으로일반적인 명령줄 처리를 통해 나머지 인수와 주석 문자를 사용하여 명령을 생성하고 명령 기록을 통해 명령을 찾는 기능을 구현할 수 있습니다.

*이 마법을 사용하면 문자 그대로 , (및 기타 문자를 입력할 수 있습니다 . 그러나 이것은 또한 $리터럴이기 때문에 쉘 변수를 사용할 수 없다는 것을 의미합니다 .

$ x=5.0
$ y=-1.2
$ z=4.7
$ c ($x + $y) > $z
(standard_in) 1: illegal character: $
(standard_in) 1: illegal character: $
(standard_in) 1: illegal character: $

나는 몇 가지 지침을 통해 이 문제를 해결했습니다.

$ echo "x=$x; y=$y; z=$z"
x=5.0; y=-1.2; z=4.7
$ c x=5.0; y=-1.2; z=4.7; (x + y) > z
0

bc Enter1 + 1을 입력하는 것이 더 나을 수도 있습니다.Enter Control+D


bc그건 그렇고, 나는 에 기본 설정(예: scale) 을 갖고 있고 에 $HOME/.bc별칭을 사용합니다 bc -l. 귀하의 사용에는 이러한 수정이 필요하지 않을 수도 있습니다.

답변4

다음 명령줄 입력은 매우 간단합니다.

<<< 5+4 bc
<<< 6/3 bc
<<< 7*2 bc

약간 더 복잡한 괄호(인용하거나 이스케이프해야 함)

<<< "(5+4)*2/3" bc
<<< \(5+4\)*2/3 bc

관련 정보