2

У меня есть скрипт Bash (назовем его clock), который должен работать как оболочка, похожая на ключевое слово time в Bash, например, clock ls должен что-то сделать, а затем запустить ls . Вот пример этого скрипта:

#!/bin/bash
echo "do something"
$@

Обратите внимание, что он не использует exec , чтобы разрешить перенос встроенных модулей.

Однако, когда аргумент для переноса является ключевым словом time , он не работает должным образом: выходные данные показывают, что он запускает команду /usr/bin/time , а не ключевое слово shell.

Как я могу заставить мой скрипт-обертку обрабатывать ключевые слова (например, time) точно так же, как если бы они были введены непосредственно в оболочке?

Примечание . В моем связанном вопросе я узнал, как заставить его работать, когда в этом же сценарии clock были функцией Bash, но в моем реальном случае использования clock фактически являются самим сценарием Bash, поэтому предыдущее решение не работает. Кроме того, решения, упомянутые в связанном вопросе (использование $@ напрямую или запуск exec bash -c ""$@""), не работают в этом случае.

Одно частичное решение, которое я нашел, состояло в том, чтобы использовать eval $@ , но это очень ненадежно. В этом простом случае он работает со time , но во многих ситуациях дает сбой, например, в clock ls '~$Document1' .

1 ответ1

0

Насколько я помню, в bash есть builtin команда, которая заставляет его работать, как вы уже догадались, встроенная команда, даже если в PATH есть файл с таким же именем.


Я проверил, сделав этот скрипт в /usr/bin:

#!/bin/bash
echo "This is /usr/bin/cd, and it does nothing"

И вот результаты:

jarmund@jarmint/etc$ /usr/bin/cd ~
This is /usr/bin/cd, and it does nothing
jarmund@jarmint/etc$ builtin cd ~
jarmund@jarmint~$ 

Вывод: добавление префикса к вашей команде со builtin командой должно устранить любую двусмысленность, которую может испытывать оболочка.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .