원격 SSH 명령 - bash 바인딩 경고: 줄 편집이 활성화되지 않았습니다.

원격 SSH 명령 - bash 바인딩 경고: 줄 편집이 활성화되지 않았습니다.

나는 bash 4.3.11(1)을 사용하고 있으며 다음 기록 플러그인을 설치했습니다..bash_it):

# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
bind '"^[[B":history-search-forward'

대화형 세션에 로그인하면 모든 것이 정상이지만 ssh host 'ls -als'예를 들어 원격 명령을 실행하면 다음 출력이 표시됩니다.

: ssh host 'ls -als'
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 3: bind: warning: line editing not enabled
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 4: bind: warning: line editing not enabled

각 바인드 호출 후 기록 플러그인을 수정하면 echo -e '\0033\0143'더 이상 경고가 표시되지 않지만 콘솔은 지워집니다. 큰 단점은 아니지만 원격 명령에 대해 이를 억제하는 더 깔끔한 방법을 아는 것이 좋을 것입니다.

# Works, but annoyingly clears console
# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
echo -e '\0033\0143'
bind '"^[[B":history-search-forward'
echo -e '\0033\0143'

답변1

대화형 세션을 갖는 것만으로는 bind작업하기에 충분하지 않습니다. 예를 들어 emacs 쉘은 테스트를 통과하는 대화형 세션을 제공 if [ -t 1 ]하지만 줄 편집 기능이 없으므로 모든 binds가 ~/.bashrc경고를 생성합니다. 대신 다음과 같은 작업을 수행하여 줄 편집이 활성화되어 있는지 확인할 수 있습니다(더 간단하고 더 나은 방법이 있습니까?).

if [[ "$(set -o | grep 'emacs\|\bvi\b' | cut -f2 | tr '\n' ':')" != 'off:off:' ]]; then
  echo "line editing is on"
fi

답변2

ssh host 'ls -als'

원격 시스템에서 명령을 실행하도록 ssh에 요청하면 ssh는 일반적으로 원격 세션에 대해 PTY(의사 TTY)를 할당하지 않습니다. ssh를 실행하여 -t강제로 tty를 할당할 수 있습니다.

ssh -t host 'ls -als'

항상 입력하고 싶지 않다면 로컬 호스트의 ".ssh/config" 파일에 다음 줄을 추가할 수 있습니다.

RequestTTY yes

또는 원격 시스템에서 ".bashrc" 파일을 수정하여 세션이 대화형이 아닐 때 세션이 대화형이라고 가정하는 명령을 실행하지 않도록 할 수 있습니다. 한 가지 방법은 세션에 TTY가 있는지 테스트에 명령을 포함하는 것입니다.

if [ -t 1 ]
then
    # standard output is a tty
    # do interactive initialization
fi

답변3

줄 편집이 없으면 이러한 bind명령 자체는 무해합니다. 경고를 억제합니다.

bind '"^[[A":history-search-backward' 2>/dev/null
bind '"^[[B":history-search-forward'  2>/dev/null

이것은 다소 우아하지 않지만 여전히 작동해야 합니다. 다른 답변은 최상의/충분한 테스트에 동의하지 않습니다. 내 접근 방식은 이것을 우회합니다. 하지만 확장이 잘 되지는 않습니다. 두 명령만으로는 큰 차이가 나지 않습니다. 하지만 수십 개가 더 있다면 적절한 조건문이 더 나을 것입니다.

답변4

아마도 내 bash가 대화형인지 테스트할 것입니다.

if [[ "$-" = *i* ]]
then
    debug "interactive mode"
    source ~/.bash_lib/bindings
else
    debug "non interactive mode"
fi

관련 정보