Как специально запустить встроенную команду оболочки

Удивительно, но на самом деле это можно сделать только с помощью rsync (1) , без доступа оболочки к удаленному серверу.

Предполагая bash (1) и GNU date (1) :

#! /usr/bin/env bash

src=rsync://example.com/archives/
dst=/path/to/mirrors

cutoff=$( date -d '7 days ago' +%s )
rsync -na --no-motd --out-format='%M %f' "$src" "$dst" | \
    while IFS= read -r line; do
        d=${line%% *}
        fn=${line#* }
        fdate=$( date -d "${d/-/ }" +%s ) || continue
        if [ $fdate -ge $cutoff ]; then printf '%s\0' "$fn"; fi
    done | \
    rsync -a --files-from=- -0 "$src" "$dst"
2
30.04.2017, 11:25
2 ответа

Псевдонимы всегда можно обойти, заключив в кавычки любую часть имени команды, например, \source или 'source' или ''source или … (если только вы не определили псевдонимы для тех, которые zsh, но не другие оболочки, позволяет).

Функции можно обойти с помощью префикса command (например, command source) в любой оболочке POSIX. В bash или zsh вы можете использовать встроенную вместо команду , чтобы принудительно использовать встроенную ( команда возвращается к поиску PATH если нет встроенной функции с таким именем, а в zsh (кроме случаев эмуляции других оболочек) команда вообще пропускает встроенные функции). Вы можете отключить функцию, например. отменить -f источник.

Если вы переопределили или отключили все встроенные, команды и неустановленные, вам может потребоваться отказаться от идеи восстановления этого экземпляра оболочки в разумное состояние.

5
27.01.2020, 21:49

Для этого в Bash есть команда builtin:

builtin: builtin [shell-builtin [arg...]]
Execute shell builtins.

Execute SHELL-BUILTIN with arguments ARGs without performing command
lookup.  

.

$ cat > hello.sh
echo hello
$ source() { echo x ; }
$ source hello.sh
x
$ builtin source hello.sh
hello

Однако ничто не мешает вам переопределить builtin.

Еще один способ обойти псевдонимы (, но не функции ), заключается в заключении в кавычки (части )слова:

$ alias source="echo x"
$ source hello.sh 
x hello.sh
$ \source hello.sh
hello
7
27.01.2020, 21:49

Теги

Похожие вопросы