
나는 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 ]
하지만 줄 편집 기능이 없으므로 모든 bind
s가 ~/.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