대개는 나 자신(및 Google)이 알아낼 수 있습니다. 그런데 최근 이런 이상한 현상 때문에 혼란스러워졌습니다.
배경: 저는 파일 처리를 위해 일련의 스크립트를 사용합니다(Windows에서는 Cygwin에서. 스크립트는 OS X에서도 gnu baseutil을 사용하여 실행됩니다). 설치한지 하루만에실시간 도구, 내 스크립트가 작동을 멈췄습니다. 우여곡절 끝에 드디어 문제를 발견했습니다.
문제: 다음 줄이 있습니다.
key=$( echo "$foo" | tr -d - | tr '[:upper:]' '[:lower:]' )
$foo
또 다른 텍스트 변수입니다 . 대시를 제거 $foo
하고 소문자로 변환했습니다. 스크립트는 수천 번 실행되었습니다.
하지만 더 이상은 아닙니다. 내가 달리면
echo "Blah-Bleh" | tr -d - | tr '[:upper:]' '[:lower:]'
나는 blahbleh
이것이 예상되는 것을 이해합니다. 하지만 내가 그렇게 한다면
a=$(echo "Blah-Bleh" | tr -d - | tr '[:upper:]' '[:lower:]')
echo $a
나는 아무것도 얻지 못했습니다. $a
비어 있고 [[ -z $a ]] 가 반환됩니다 true
. 그러나 구식 백틱으로 되돌리면 명령이 다시 작동합니다.
a=`echo "Blah-Bleh" | tr -d - | tr '[:upper:]' '[:lower:]'`
echo $a
주어진 blahbleh
.
지금 나는할 수 있는모든 명령 대체를 이전 스타일로 대체했지만 이는 솔루션이라기보다는 해결 방법에 가깝습니다. 그렇다면 StackExchanger 동료 여러분, 제가 무엇을 놓쳤으며 어떻게 해결해야 할까요? 정말 짜증나.
PS 지금까지 내 진단은 다음과 같습니다.
- Rtools를 제거해도 도움이 되지 않습니다.
- 기계를 다시 시작해도 도움이 되지 않았습니다.
- 다시 설치모든Cygwin 패키지는 도움이 되지 않습니다.
bash
버전은 4.3.42(4)입니다.~/.bashrc
이제 ,~/.bash_profile
, 에는 아무것도 없습니다~/.profile
. Rtools 이전에는 확실하지 않습니다./etc/profile
/etc/bash.bashrc
- 문제가 무엇인지 알 수 없습니다
$PATH
.
답변1
글쎄, 많은 조작과 당김 끝에 Cygwin을 다시 작동 순서로 되돌릴 수 있었습니다. 이것이 내가 한 일입니다:
- 제거된 Rtools
- Cygwin/Rtools 관련 항목의 Windows %PATH%를 지웁니다.
- 캐시에서 모든 Cygwin 패키지를 다시 설치했습니다.
- 재설계된 Cygwin;
- 필요 이상으로 컴퓨터를 다시 시작했습니다.
다시 일터로 복귀하라...
추신. Cygwin이 다시 작동했지만 bash 배열에 값을 할당하는 원래 줄이 더 이상 올바른 결과를 생성하지 않는다는 것을 발견했습니다. 이것을 바꿔야 해
read -r -a array <<<$(printf $string)
이와 관련하여
array=($(printf $string))
작동하게 만들다. bash 업데이트여야 합니다. 그래야 합니다.
답변2
귀하의 파이프라인이 예상대로 작동하지 않는 이유는 잘 모르겠지만 더 잘 수행할 수 있다는 것은 알고 있습니다.
a='Blah-Bleh'
a=${a//-/}; a=${a,,}
printf '%s\n' "$a"
이는 내장 대체를 사용하며 bash
명령 대체보다 빠릅니다. 첫 번째 는 a=${a//-/}
의 모든 대시를 제거 $a
하고 두 번째는 a=${a,,}
전체 문자열을 소문자로 만듭니다.
bash
이는 4.0 이상에서 작동합니다.