bash가 아닌 스크립트에서 bash 내장을 실행할 수 있습니까?

bash가 아닌 스크립트에서 bash 내장을 실행할 수 있습니까?

history -w예를 들어 Ruby 스크립트에서 기본 bash 쉘을 실행할 수 있습니까 ?
아니면 pid만 알고 bash 쉘에 내장 명령을 실행하는 것이 더 낫습니까?

내가 찾은 유일한 방법은 다음과 같은 신호를 트랩 trap "history -w" SIGUSR1한 다음 처리할 신호를 보내는 것입니다. 그러나 이것이 좋은 습관이고 USR1이 bash에서 사용되지 않는지 확실하지 않습니다. 또한 이 방법으로 최대 2개의 명령(USR1 및 USR2)을 실행할 수 있습니다. . 그리고 그것을 사용하기 전에 트랩을 정의해야 합니다.

저는 Mac을 사용하고 있으므로 SIGRTMIN..SIGRTMAX가 없습니다.

이것이 필요한 이유:

dt동일한 작업 디렉토리로 현재 탭 옆에 새 탭을 여는 루비 쉘 스크립트를 만든 다음 작성했습니다.newTabHere.app같은 일을 할 수 있지만 탭이 뭔가를 실행하느라 바쁜 경우에도 이 작업을 수행할 수 있습니다(저는 다음을 사용하여 호출합니다).불꽃). 하지만 중복 탭에서도 기록이 동일하고 dt을 사용할 수 있다면 훨씬 더 좋을 것입니다 alias dt='history -w; dt'. 그런데 에서 어떻게 할 수 있습니까 newTabHere.app?

답변1

표준 입력을 입력하는 것 외에 쉘이 명령을 실행하도록 하는 기성 방법은 없습니다. 가장 쉬운 방법은 bash가 일부 파일을 검사하도록 하거나 (각 프롬프트 전에 실행되는 명령) history -w의 일부로 실행하는 것입니다.PROMPT_COMMAND

내 생각엔 당신이 쫓는 게 사실인 것 같아요Bash 터미널 창 간 실시간 기록 내보내기, 그리고 아마도더 나은 배쉬 기록.

다음을 사용하는 것도 고려할 수 있습니다.zsh(대부분의 Linux/OSX/기타 유닉스 패키지 저장소에서 사용 가능) inc_append_historyshare_history 옵션.

답변2

이 특정 사용 사례의 경우 (또는 호출되는 쉘 함수에) 추가 history -w하는 것이 좋습니다 .PROMPT_COMMAND

PROMPT_COMMAND보다 일반적으로는 외부에서 요청된 명령에 대한 대기열을 갖고 이를 실행하는 데 사용하는 것이 좋습니다 .

run_prompt_queue() {
  local f
  for f in ~/.bash_queue.d/$$-*
  do
    [[ -f $f ]] || continue # still works without nullglob
    . "$f"
    rm -fv "$f"
  done
}
PROMPT_COMMAND+=$'\n run_prompt_queue'
rm -v "$HOME/.bash_queue.d/$$-"* # clear random leftovers when PID is recycled

그런 다음 Python 스크립트에서 실행하려는 명령이 포함된 파일을 만든 다음 이름을 sprintf("%s/.bash_queue.d/%u,%s", sys.env("HOME"), pid_of_bash, your_unique_suffix).

pid_of_bash아마도 스크립트의 중첩 수준에 따라 달라질 수 있습니다 sys.getppid().sys.getsid()

분명히 파일 이름 지정에 대한 고유한 규칙을 선택할 수 있지만 적어도 옵션으로 대상 셸의 PID를 포함하는 것이 좋습니다.

특정 쉘이 무엇인지 신경 쓰지 않는다면 pgrp, sid, tty, 시간 등에 따라 트리거할 수도 있습니다.)

중요한 팁:다른 사람이 대기열 디렉터리에 쓸 수 없도록 하세요.

관련 정보