테스트 서버에서 의도적으로 삭제했습니다 ?????
. /
심볼릭 링크 /lib64
와 디렉터리가 삭제될 것으로 예상했습니다. /media
모든 것이 잘 진행되고 있었지만(모든 것이 깨졌음) 다음 결과가 궁금했습니다.
[root@testserver /]# ls
bin boot dev etc home lib lib64 media mnt opt proc rh_share3 root run sbin srv sys tmp usr var
[root@testserver /]# rm -rf ?????
bash: /usr/bin/sed: No such file or directory
[root@testserver /]# ls
bash: /usr/bin/ls: No such file or directory
bash: /usr/bin/sed: No such file or directory
일부 패키지에는 종속성이 있지만 왜 누르는 것처럼 간단한 것이 sed
필요한지 이해가 안 됩니다.sed
Enter
[root@testserver bin]# rpm -q --whatrequires sed
krb5-libs-1.17-18.el8.x86_64
ca-certificates-2019.2.32-80.0.el8_1.noarch
dracut-049-70.git20200228.el8.x86_64
crypto-policies-20191128-2.git23e1bf1.el8.noarch
policycoreutils-2.9-9.el8.x86_64
authselect-libs-1.1-2.el8.x86_64
cups-filters-1.20.0-19.el8.x86_64
open-vm-tools-11.0.0-4.el8.x86_64
authselect-compat-1.1-2.el8.x86_64
dhcp-client-4.3.6-40.el8.x86_64
nfs-utils-2.3.3-31.el8.x86_64
autofs-5.1.4-40.el8.x86_64
이 줄은 왜 bash: /usr/bin/sed: No such file or directory
나타나는 걸까요? 분명히 sed
누락된 것으로 간주되지만 왜 호출됩니까? . 을 실행하면 담당자를 strace -o bash bash
알고 있습니다 . 모든 bash 명령이 실행됩니까? 아니면 다른 일이 발생합니까?sed
stream editor
sed
운영 체제는 GUI가 포함된 OOTB RHEL 8.2(Oopta)입니다.
편집하다
출력은 다음과 같습니다 set | grep sed
.
[user1@testserver ~]$ set | grep sed
local command=$(HISTTIMEFORMAT= history 1 | sed 's/^ *[0-9]\+ *//');
COMPREPLY=($( compgen -W "$( bpftool help 2>&1 | command sed -e '/OBJECT := /!d' -e 's/.*{//' -e 's/}.*//' -e 's/|//g' )" -- "$cur" ));
COMPREPLY+=($( compgen -W "$( bpftool -jp btf 2>&1 | command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ))
COMPREPLY+=($( compgen -W "$( bpftool -jp map 2>&1 | command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ))
COMPREPLY+=($( compgen -W "$( bpftool -jp map 2>&1 | command grep -C2 "$type" | command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ))
COMPREPLY+=($( compgen -W "$( bpftool -jp prog 2>&1 | command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ))
COMPREPLY+=($( compgen -W "$( bpftool -jp prog 2>&1 | command sed -n 's/.*"tag": "\(.*\)",$/\1/p' )" -- "$cur" ))
type=$(bpftool -jp map show $keyword $ref | command sed -n 's/.*"type": "\(.*\)",$/\1/p');
COMPREPLY=($( compgen -W "$( command sed -ne 's|^iface \([^ ]\{1,\}\).*$|\1|p' /etc/network/interfaces /etc/network/interfaces.d/* 2>/dev/null )" -- "$cur" ));
COMPREPLY=($( compgen -W "$( printf '%s\n' /etc/sysconfig/network/ifcfg-* | command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p' )" -- "$cur" ));
COMPREPLY=($( compgen -W "$( command ls -B /etc/sysconfig/interfaces | command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p' )" -- "$cur" ));
COMPREPLY=($( compgen -W "$( printf '%s\n' /etc/sysconfig/network-scripts/ifcfg-* | command sed -ne 's|.*ifcfg-\([^*].*\)$|\1|p' )" -- "$cur" ));
local included=$( command sed -ne 's/^[[:blank:]]*[Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]\{1,\}\([^#%]*\)\(#.*\)\{0,1\}$/\1/p' "${configfile}" );
COMPREPLY+=($( compgen -W "$( { LC_ALL=C ifconfig -a || ip addr show; } 2>/dev/null | command sed -ne 's/.*addr:\([^[:space:]]*\).*/\1/p' -ne 's|.*inet[[:space:]]\{1,\}\([^[:space:]/]*\).*|\1|p' )" -- "$cur" ))
[[ $# -ge $OPTIND ]] && echo "error: $FUNCNAME("$@"): unprocessed arguments:" $(while [[ $# -ge $OPTIND ]]; do printf '%s\n' ${!OPTIND}; shift; done);
local hosts=$( command sed -ne 's/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\{1,\}\([^#*?%]*\)\(#.*\)\{0,1\}$/\1/p' "${config[@]}" );
local argtype=$( LC_ALL=C $1 --help 2>&1 | command sed -ne "s|.*$prev\[\{0,1\}=[<[]\{0,1\}\([-A-Za-z0-9_]\{1,\}\).*|\1|p" );
COMPREPLY=($( compgen -W "$( LC_ALL=C $1 --help 2>&1 | command sed -ne 's/.*\(--[-A-Za-z0-9]\{1,\}=\{0,1\}\).*/\1/p' | sort -u )" -- "$cur" ));
COMPREPLY+=($( { LC_ALL=C ifconfig -a || ip link show; } 2>/dev/null | command sed -ne "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]].*/\1/p" -ne "s/.*[[:space:]]HWaddr[[:space:]]\{1,\}\($re\)[[:space:]]*$/\1/p" -ne "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]].*|\2|p" -ne "s|.*[[:space:]]\(link/\)\{0,1\}ether[[:space:]]\{1,\}\($re\)[[:space:]]*$|\2|p"
COMPREPLY+=($( { arp -an || ip neigh show; } 2>/dev/null | command sed -ne "s/.*[[:space:]]\($re\)[[:space:]].*/\1/p" -ne "s/.*[[:space:]]\($re\)[[:space:]]*$/\1/p" ));
COMPREPLY+=($( command sed -ne "s/^[[:space:]]*\($re\)[[:space:]].*/\1/p" /etc/ethers 2>/dev/null ));
COMPREPLY=($( compgen -W "$( command ls -RL $modpath 2>/dev/null | command sed -ne 's/^\(.*\)\.k\{0,1\}o\(\.[gx]z\)\{0,1\}$/\1/p' )" -- "$cur" ))
COMPREPLY=($( compgen -X '<defunct>' -W '$( command ps axo comm | command sed -e 1d )' -- "$cur" ));
COMPREPLY=($( compgen -X '<defunct>' -W '$( command ps axo command= | command sed -e \
COMPREPLY=($( compgen -W '`command sed -e "y/|/ /" \
COMPREPLY+=($( compgen -W "$( command sed -ne 's/^\([^[:space:]#|]\{2,\}\)|.*/\1/p' /etc/termcap 2>/dev/null )" -- "$cur" ));
답변1
이 동작을 일으키는 파일은 vte.sh
다음 위치에 있습니다 /etc/profile.d/
.
VTE 구성의 한 가지 측면은 사용법입니다
/etc/profile.d/vte.sh
. VTE는PROMPT_COMMAND
터미널 제어 코드를 통해 자체적으로 추가 정보를 제공하기 위해 이 스크립트를 사용하여 재정의합니다. 특히 이 스크립트는 VTE 셸에 현재 디렉터리를 알려주는 데 사용됩니다. 이전에는 이를 읽는 데 VTE 구성 요소를 사용했지만/proc/<pid>/cwd
VTE 업스트림에 따르면 이 접근 방식에는 문제가 많아/etc/profile.d/vte.sh
.
이 동작은 GNOME 터미널을 사용할 때만 SSH를 통해서는 발생하지 않습니다. Windows 시스템에 대해 더 잘 아는 사람이 더 자세한 답변을 작성해 주신다면 기꺼이 받아들이겠습니다. 현재 그놈에 대한 이해가 제한되어 있기 때문입니다.
답변2
나생각하다command
문제는 내장 함수인 을 재정의했다는 것입니다 .
$ help command | head --lines=2
command: command [-pVv] command [arg ...]
Execute a simple command or display information about commands.
command
일반적으로 내장 또는 실행 파일을 명시적으로 직접 실행하기 위해 별칭과 함수를 무시하는 데 사용됩니다. 이는 무한 루프를 방지하는 데 유용합니다. 예를 들어:
ls() {
command ls --color=auto
}
이는 ls
자신을 영원히 재귀적으로 호출하는 대신 실행 파일을 호출합니다.
unset command
command
Bash 구성 파일에서 사용법을 찾으십시오.
답변3
이것은 단지 추측일 뿐이지만 sed
동적으로 연결된 64비트 바이너리일 수도 있습니다. 이를 제거하면 커널은 더 이상 lib64
실행에 필요한 동적 링커 sed
(및 아마도 다른 모든 것) 를 찾을 수 없습니다. 가 아니라 링커를 위한 것입니다 no such file or directory
.sed
답변4
이는 /etc/profile.d/vte.sh 때문입니다.
case "$TERM" in
xterm*|vte*)
[ -n "$BASH_VERSION" ] && PROMPT_COMMAND="__vte_prompt_command"
[ -n "$ZSH_VERSION" ] && precmd_functions+=(__vte_osc7)
;;
esac
vte_prompt_command() {
######### HERE : bash tries to look up comletions with sed ###
local command=$(HISTTIMEFORMAT= history 1 | sed 's/^ *[0-9]\+ *//')
############################################################
command="${command//;/ }"
local pwd='~'
[ "$PWD" != "$HOME" ] && pwd=${PWD/#$HOME\//\~\/}
printf "\033]777;notify;Command completed;%s\007\033]0;%s@%s:%s\007%s" "${command}" "${USER}" "${HOSTNAME%%.*}" "${pwd}" "$(__vte_osc7)"
}
그냥 삭제하세요(그러면 올바른 파일 이름을 사용해야 합니다).
sed 's/^ *[0-9]\+ *//'
안정적인!