나는 Linux의 쉘 스크립트나 명령에 대해 전혀 아는 바가 없습니다.
라는 파일이 있습니다projectx
projectX
방금users/hardik/desktop/projectx
쉘 스크립트를 만들었습니다 start.sh
. 쉘 스크립트의 내용은 다음과 같습니다.
echo "Starting typescript build in new terminal.."
osascript -e 'tell application "Terminal" to do script "npm run build"'
sleep 3
echo "Starting firebase functions...."
osascript -e 'tell application "Terminal" to do script "firebase emulators:start --only functions"'
echo "Process compelete.. Check if there were two terminals window open"
이제 이것은 작동하지만 여기서는 다음과 같이 말합니다.
osascript -e 'tell application "Terminal" to do script "npm run build"'
루트 디렉터리에서 실행 중이므로 다음 오류가 발생합니다.
ENOENT: 해당 파일이나 디렉터리가 없습니다. 열려 있습니다./Users/hardik/package.json
상대 경로에서 실행되게 하려면 어떻게 해야 합니까?start.sh
업데이트: 시도해 보았지만 작동하지 않았습니다.
cd "$(dirname $(readlink -f "$0"))"
echo "Starting typescript build in new terminal.."
osascript -e 'tell application "Terminal" to do script "npm run watch:scss"'
osascript -e 'tell application "Terminal" to do script "npm run watch"'
echo "Process compelete.. Check if there were two terminals window open"
위에 녹음한 내용이에요
readlink: illegal option -- f
usage: readlink [-n] [file ...]
usage: dirname path
Starting typescript build in new terminal..
tab 1 of window id 1579
tab 1 of window id 1580
아래 코드 조각도 작동하지 않습니다.
cd -P -- "${0%/*}" || exit
echo "Starting typescript build in new terminal.."
osascript -e 'tell application "Terminal" to do script "npm run watch:scss"'
osascript -e 'tell application "Terminal" to do script "npm run watch"'
echo "Process compelete.. Check if there were two terminals window open"
같은 오류
답변1
스크립트에
cd -P -- "${0%/*}" || exit
또는 를 추가하여 cd -P -- "$(dirname -- "$0")" || exit
스크립트가 있는 디렉터리로 이동할 수 있습니다.
$0
는내장 변수인터프리터에 저장된 스크립트의 경로입니다. 에서 스크립트를 찾는 경우 일반적으로 절대 경로입니다 $PATH
.
이 ${0%/*}
구성은 쉘의 내장을 사용합니다.문자열 연산/*
디렉터리 이름만 남도록 끝에서 일치하는 변수의 가장 짧은 비트를 제거합니다 (일반적으로 그렇듯이, $0
이는 최소한 하나의 문자가 포함되어 있는 한 /
작동합니다 ).
답변2
이것이 MacOS에서 작동하는지 모르겠습니다. Linux에서는 다음과 같습니다.
#! /bin/bash
arg1="$(awk 'BEGIN { RS="\0" }; NR==2 { print $0 "x"; exit; }' /proc/$$/cmdline; echo x)"
arg1="${arg1%x}"
if [[ $arg1 =~ / ]]; then
# path contains at least one /
dir_rel_path="${arg1%/*}"
cd "$dir_rel_path"
fi
echo "$PWD"