유닉스에서 잘라낸 명령 범위

유닉스에서 잘라낸 명령 범위

쉘 스크립트를 만들려고 하는데 다음과 같이 'cut' unix 명령을 사용하여 문자열을 자르고 싶습니다.

namecmpaux=$(echo $namecmp |cut -c0-19)

그러나 쉘을 실행하면 다음 오류가 표시됩니다.

cut: fields and positions are numbered from 1 
Try `cut - help 'for more information.

이전에 0을 하한 위치로 사용하여 'cut' 명령을 사용한 기억이 나지만 이제는 명령이 1에서 시작해야 한다고 알려줍니다. 왜? 운영 체제에 따라 다릅니다. 이전에는 SunOS를 사용했고 지금은 우분투 12.04를 사용하고 있습니다.

답변1

cut아니요, 모든 구현 에서 동일합니다 . 숫자는 1부터 시작합니다. 0을 제공하면 솔라리스는 불평하지 않고 1로 처리합니다. 둘 다 01거기는 첫 번째 문자를 의미하고 2두 번째 문자를 의미합니다.

$ echo test | cut -c 0-2
te
$ echo test | cut -c 1-2
te

busybox cut또는 cut내장 ksh93도 불평하지 않습니다. GNU는 cut아마도 첫 번째 인덱스가 무엇인지에 대해 올바른 생각을 갖고 있지 않을 수도 있음을 알려주는 데 도움이 되려고 노력할 뿐입니다.

그러나 실제 차이점은 GNU와 busybox cut(적어도 2014-03-27 기준)는 에 대해 바이트 단위로 계산하는 -c반면 Solaris 또는 ksh는 cutPOSIX에서 요구하는 대로 문자로 계산한다는 것입니다.

$ echo 'Stéphane' | cut -c 1-4
Sté
$ echo 'Stéphane' | busybox cut -c 1-4
Sté
$ echo 'Stéphane' | ksh -c 'command /opt/ast/bin/cut -c 1-4'
Stép

(UTF-8 로케일에서 é(U+00E9)는 2바이트를 사용합니다.)

답변2

예, 실제로 OS에 따라 다를 수 있습니다(또는 의 버전을 작성한 사람에 따라 다름 cut).

을 살펴보면 GNU가 1에서 바이트, 문자 및 필드를 계산하는 man cut것을 볼 수 있습니다 .cutcoreutils

-b, -c 또는 -f 중 하나만 사용하십시오. [...] 각 범위는 다음 중 하나입니다.
      N      N'번째 바이트, 문자 또는 필드(1부터 계산)

다시 말하지만, 관리자가 GNU 구현이 아닌 다른 구현을 사용하기로 결정한 경우 다른 시스템에서는 다를 수 있으므로 cut안전을 위해 맨페이지를 살펴보는 것이 좋습니다.

답변3

이전에는 Linux에서도 작동했습니다. 나는 방금 그것에 물려서 (Debian에서 cut 명령이 포함된 coreutils 패키지를 업데이트한 후) 이 버그를 발견했습니다.

coreutils의 버그입니다.

https://bugs.launchpad.net/ubuntu/+source/coreutils/+bug/211262

누군가 고의로 이전 버전과의 호환성을 깨뜨렸지만 아무도 이를 고치지 않았습니다. 예전에는 0도 괜찮고 1로 취급되던데 이제는 0이 오류를 발생시킵니다. 따라서 이 동작에 의존하는 모든 스크립트는 손상되어 변경되어야 합니다.

관련 정보