Стандартного способа не существует.
Вы можете избежать использования временной переменной, используя функцию. Следующая функция заботится о том, чтобы переменные без установки оставались без установки, а пустые переменные - пустыми. Однако она не поддерживает возможности, встречающиеся в некоторых оболочках, такие как переменные только для чтения или типизированные переменные.
unexport () {
while [ "$#" -ne 0 ]; do
eval "set -- \"\${$1}\" \"\${$1+set}\" \"\$@\""
if [ -n "$2" ]; then
unset "$3"
eval "$3=\$1"
fi
shift; shift; shift
done
}
unexport foo bar
В ksh, bash и zsh переменную можно раскрыть с помощью typeset +x foo
. Это сохраняет специальные свойства, такие как типы, поэтому предпочтительнее использовать именно это. Я думаю, что все оболочки, имеющие встроенный typeset
, имеют typeset +x
.
case $(LC_ALL=C type typeset 2>&1) in
typeset\ *\ builtin) unexport () { typeset +x -- "$@"; };;
*) unexport () { … };; # code above
esac
Попробуйте использовать полный путь дляls
:
[ctor@dom0 tst]$ /lib64/ld-linux-x86-64.so.2 /usr/bin/ls
afile
[ctor@dom0 tst]$ /lib64/ld-linux-x86-64.so.2 ls
ls: error while loading shared libraries: ls: cannot open shared object file
[ctor@dom0 tst]$ /lib64/ld-linux-x86-64.so.2 anyinexistentcommandhere
anyinexistentcommandhere: error while loading shared libraries: anyinexistentcommandhere: cannot open shared object file
[ctor@dom0 tst]$ ldd ls
ldd:./ls: No such file or directory
[ctor@dom0 tst]$ ldd `type -P ls`
linux-vdso.so.1 (0x00007fffd636c000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x000074b858cc3000)
libcap.so.2 => /lib64/libcap.so.2 (0x000074b858abe000)
libc.so.6 => /lib64/libc.so.6 (0x000074b8586f8000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x000074b858486000)
libdl.so.2 => /lib64/libdl.so.2 (0x000074b858282000)
/lib64/ld-linux-x86-64.so.2 (0x000074b85910a000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x000074b858064000)
[ctor@dom0 tst]$ LD_DEBUG=libs /lib64/ld-linux-x86-64.so.2 ls
6380: find library=ls [0]; searching
6380: search cache=/etc/ld.so.cache
6380:
ls: error while loading shared libraries: ls: cannot open shared object file
[ctor@dom0 tst]$ LD_DEBUG=libs /lib64/ld-linux-x86-64.so.2 inexistentcommand
6415: find library=inexistentcommand [0]; searching
6415: search cache=/etc/ld.so.cache
6415:
inexistentcommand: error while loading shared libraries: inexistentcommand: cannot open shared object file
[ctor@dom0 tst]$ LD_DEBUG=libs /lib64/ld-linux-x86-64.so.2 /usr/bin/ls
6342: find library=libselinux.so.1 [0]; searching
6342: search cache=/etc/ld.so.cache
6342: trying file=/lib64/libselinux.so.1
6342:
6342: find library=libcap.so.2 [0]; searching
6342: search cache=/etc/ld.so.cache
6342: trying file=/lib64/libcap.so.2
6342:
6342: find library=libc.so.6 [0]; searching
6342: search cache=/etc/ld.so.cache
6342: trying file=/lib64/libc.so.6
6342:
6342: find library=libpcre.so.1 [0]; searching
6342: search cache=/etc/ld.so.cache
6342: trying file=/lib64/libpcre.so.1
6342:
6342: find library=libdl.so.2 [0]; searching
6342: search cache=/etc/ld.so.cache
6342: trying file=/lib64/libdl.so.2
6342:
6342: find library=libpthread.so.0 [0]; searching
6342: search cache=/etc/ld.so.cache
6342: trying file=/lib64/libpthread.so.0
6342:
6342:
6342: calling init: /lib64/libpthread.so.0
6342:
6342:
6342: calling init: /lib64/libc.so.6
6342:
6342:
6342: calling init: /lib64/libdl.so.2
6342:
6342:
6342: calling init: /lib64/libpcre.so.1
6342:
6342:
6342: calling init: /lib64/libcap.so.2
6342:
6342:
6342: calling init: /lib64/libselinux.so.1
6342:
6342:
6342: initialize program: /usr/bin/ls
6342:
6342:
6342: transferring control: /usr/bin/ls
6342:
afile