이 있지만 alias
그것을 할 수있는 한 가지 방법은,이 수 와 함께 할 eval
뿐만 아니라 - 그것은 당신이 너무 많은 희망을하지 않는 것을 단지 eval
당신이 원하는대로 명령 실행 eval
명령 선언 .
나는 alias
es를 좋아한다 -나는 항상 그들을 사용하지만, 나는 기능을 더 좋아한다-특히 매개 변수를 처리하는 능력은 alias
es에 필요한 명령 위치에서 반드시 확장 할 필요는 없다 .
그래서 당신도 이것을 시도하고 싶을 것이라고 생각했습니다.
_time() if set -- "${IFS+IFS=\$2;}" "$IFS" "$@" && IFS='
'; then set -- "$1" "$2" "$*"; unset IFS
eval "$1 $TIME ${3#"$1"?"$2"?}"
fi
$IFS
비트는 주로 관한 것입니다 $*
. (가) 있다는 것이 중요 ( subshell bit )
하다 또한 쉘 확장의 결과 때문에 구문 분석 문자열 I 사용에 인수를 확장하기 위해 "$*"
(하지 eval
"$@"
, 그런데, 당신은 인수의있는 거 특정 모든 공간에 가입 할 수없는) . args 사이의 분리 구분 기호 "$*"
는의 첫 번째 바이트 $IFS
이므로 값을 지정하지 않고 진행하는 것은 위험 할 수 있습니다. 함수가 저장 그래서 $IFS
하는로 설정 \n
충분히에 ewline set ... "$*"
로 "$3"
, unset
이전에 하나가 있다면 그 값을 재설정, 그것을이야.
다음은 약간의 데모입니다.
TIME='set -x; time'
_time \( 'echo "$(echo any number of subshells)"' \
'command -V time' \
'hash time' \
\) 'set +x'
당신은 내가 $TIME
거기에 값을 두 가지 명령을 넣은 것을 보았습니다 – 어떤 숫자도 괜찮습니다 – 아무 것도 없더라도 – 그것이 이스케이프되고 올바르게 인용되어 있는지 확인하십시오 – 그리고 똑같은 주장이 _time()
있습니다. 그것들은 실행될 때 모두 단일 명령 문자열로 연결되지만 각 arg는 고유 한 \n
ewline을 얻으므로 상대적으로 쉽게 퍼질 수 있습니다. 또는 원하는 경우 하나를 하나로 \n
묶어서 ewlines 또는 semi-colon 또는 what-have-you로 분리 할 수 있습니다. 하나의 인수가 스크립트를 호출 할 때 자신 만의 라인을 작성하는 것이 편한 명령을 나타내는 지 확인하십시오. \(
예를 들어 결국에는을 따르는 한 괜찮습니다 \)
. 기본적으로 정상적인 것.
때 eval
위의 코드 조각을 공급 도착은 다음과 같습니다
+ eval 'IFS=$2;set -x; time (
echo "$(echo any number of subshells)"
command -V time
hash time
)
set +x'
결과는 다음과 같습니다.
산출
+++ echo any number of subshells
++ echo 'any number of subshells'
any number of subshells
++ command -V time
time is a shell keyword
++ hash time
bash: hash: time: not found
real 0m0.003s
user 0m0.000s
sys 0m0.000s
++ set +x
hash
오류 내가 가지고 있지 않은 것을 나타냅니다 /usr/bin/time
설치 (I하지 않기 때문에) 와 command
우리가 실행되는 시간을 알고하자. 후행 set +x
은 이후에 실행되는 또 다른 명령 time
입니다 (가능한 경우)eval
. 입력 할 때 입력 명령에주의하는 것이 중요합니다 .