mkdir을 사용할 때 디렉터리 이름에 불필요한 물음표가 추가됩니다.

mkdir을 사용할 때 디렉터리 이름에 불필요한 물음표가 추가됩니다.

mkdir -p $fbase 를 사용할 때 왜 원치 않는 것이 나오는지 잘 모르겠습니다. 디렉터리 이름에 추가됩니다(27obs87St01Rec1?). 비슷한 스레드를 따라 cat -A filename을 실행하여 스크립트에 원치 않는 문자가 있는지 확인했지만 아무 것도 없는 것 같습니다. 나는 또한 dos2unix filename을 실행했습니다. 저는 Linux 시스템에서 처음부터 스크립트를 작성하고 있으므로 Windows의 영향을 받지 않습니다. $filebase 매개변수를 사용했기 때문입니다. 도움을 주셔서 감사합니다.

#!/bin/csh

# Distribute files into separate directories and run SHEBA on each
# Check what phase to run analysis for

echo "RUN_SHEBA.CSH: CNTRL-C to abort"

unalias sac

mkdir -p filtered
mkdir -p stack
mkdir -p plots
mkdir -p results

# READ STATION LIST

set nev = `cat stationlist1.csv | wc -l`
echo "NUMBER OF EVENTS=" $nev
@ iev = 1
echo $iev

# LOOP OVER EVENTS
while ($iev <= $nev)
echo "CURRENT EVENT=" $iev

# EXTRACT EVENT LINE
set fbase = `head -$iev stationlist1.csv | tail -1`
echo $fbase


# CLEAN UP ANY PRE-EXISTING DIRECTORIES
\rm -rf $fbase

mkdir -p $fbase

# COPY THE FILES
cp ~/SAC/sac/macros/$fbase.* $fbase

cd $fbase

전체 스크립트는 아래와 같습니다...

#!/bin/csh

# Distribute files into separate directories and run SHEBA on each
# Check what phase to run analysis for

echo "RUN_SHEBA.CSH: CNTRL-C to abort"

unalias sac

mkdir -p filtered
mkdir -p stack
mkdir -p plots
mkdir -p results

# READ STATION LIST

set nev = `cat stationlist1.csv | wc -l`
echo "NUMBER OF EVENTS=" $nev
@ iev = 1
echo $iev

# LOOP OVER EVENTS
while ($iev <= $nev)
echo "CURRENT EVENT=" $iev

# EXTRACT EVENT LINE
set fbase = `head -$iev stationlist1.csv | tail -1`
echo $fbase


# CLEAN UP ANY PRE-EXISTING DIRECTORIES
\rm -rf $fbase

mkdir -p $fbase

# COPY THE FILES
cp ~/SAC/sac/macros/$fbase.* $fbase

cd $fbase

## CONFIGURE SHEBA

# BUILD THE ANALYSIS MACRO
cat << END >.temporary_sac_shebanew
setmacro /apps/SAC/sac/macros
window 1 X 0.1 0.6 Y 0.50 1.00
qdp off
gtext hardware
END

echo "m shebanew file $fbase comps C1 C2 C3 pick no plot yes batch yes" >>.temporary_sac_shebanew

# RUN SHEBA

sac .temporary_sac_shebanew

\cp ${fbase}_result.eps ../plots
\cp ${fbase}.lam2 ../stack
\cp *.final_result ../results

cd..

@ iev = $iev + 1

echo "I AM FINISHED"
end

답변1

입력 파일이 Windows에서 준비되어 있는 것을 수정구에서 볼 수 있습니다.

나는 그 문자가 물음표가 아니라 단지 ls인쇄할 수 없는 문자가 있다는 것을 알려줄 뿐이라고 확신합니다. 문제의 인쇄할 수 없는 문자는 캐리지 리턴(CR, 일반적으로 \r또는 로 표시됨 \015) 입니다 ^M.

CR 문자는 Windows에서 생성된 텍스트 파일의 줄 끝에 나타납니다. Windows와 Unix는 텍스트 파일을 다르게 나타냅니다. Unix는 LF 문자( \n, \012, ^J)를 줄 종결자로 사용합니다(즉, 각 줄은 인쇄 가능한 문자와 LF로 구성됩니다). Windows는 두 문자 시퀀스 CR-LF를 줄 종결자로 사용합니다. 줄 구분 기호(즉, 각 줄은 인쇄 가능한 문자, CR, LF로 구성되지만 일반적으로 마지막 줄은 인쇄 가능한 문자로만 구성됩니다.) 따라서 Windows 텍스트 파일을 Unix 시스템에 복사하면 때로는 마지막 줄을 제외한 모든 줄 끝에 이 가짜 CR 문자가 표시됩니다. Linux 또는 기타 Unix 시스템의 경우 CR 문자는 일반 문자(비록 인쇄할 수는 없지만)이므로 그대로 남아 문제를 일으킵니다.

이 파일을 Unix 텍스트 파일로 변환해야 합니다. Linux에서는 다음을 사용할 수 있습니다.

sed -i -e 's/\r$//' /path/to/file

또는 깨끗한 복사본을 만들려면 다음을 사용할 수 있습니다.

</path/to/windows/file tr -d '\r' >/path/to/unix/file

스크립트를 더욱 강력하게 만들려면 파일을 읽을 때 CR을 제거하세요.

set fbase = `head -$iev stationlist1.csv | tail -1 | tr -d '\r'`

관련 정보