У меня есть alias
набор для моей rm
команды. Если я запускаю alias
команду, это то, что я получаю в качестве вывода.
alias rm='rm -i'
Теперь, когда я запускаю rm
команду, она работает нормально, как и ожидалось.
rm ramesh
rm: remove regular empty file `ramesh'? y
Теперь я изучал системные вызовы, которые вызываются при выполнении команды. Для этого я должен знать о strace
команде из здесь , которые перечислены мне , что файлы, которые вызываются когда я выполнить какую - либо команду. Команда как ниже.
strace -ff -e trace=file rm ramesh 2>&1
Команда работает отлично, за исключением того, что она игнорирует мои псевдонимы, которые у меня есть для моей rm
команды. Удаляет файл без запроса пользователя.
Итак, strace
игнорирует псевдонимы, как это? Если так, то почему?
РЕДАКТИРОВАТЬ:
Не уверен, если это что-то делать, но type -a rm
дает мне вывод, как,
rm is aliased to `rm -i'
rm is /bin/rm
Так что же, /bin/rm
в данном случае это рассматривается, поэтому пользователь не получает запрос перед удалением?
strace
не игнорирует псевдонимы, потому что это означало бы, что в первую очередь было что игнорировать. Псевдоним - это особенность оболочки.strace
это другая программа, и внутриstrace
понятия псевдонимов не существует, поэтому игнорировать нечего. API, предоставляемый ядром для выполнения программ, также не имеет понятия псевдонимов, поэтому оболочка не может сказать strace об псевдонимах, даже если захочет.strace
использовать псевдоним, вам нужнаstrace
оболочка, которая реализует псевдоним. Для этого есть несколько подходов:strace -p $$ &
илиstrace bash
илиstrace sh -c 'rm ramesh'
(последний также игнорирует псевдоним, но по совершенно другой причине.)Ответы:
strace
не работаетrm -i
по той же причине, что и:не выводится
rm -i
.Псевдонимы - это особенность нескольких оболочек, позволяющая автоматически заменять некоторые строки другой, находясь в командном положении.
В:
Снаряды расширяют это до:
и это подвергается другому раунду интерпретации, в этом случае приводящему к выполнению
whatever
команды.псевдонимы раскрываются только при нахождении в командной позиции (как первое слово командной строки).
zsh
поддерживает глобальные псевдонимы.Вы могли бы сделать:
Но вы не захотите, так как это будет означать, что:
будет выводить,
rm -i
например.источник
strace
используетPATH
переменную окружения, чтобы найти отслеживаемую программу, а не выполнять ее через оболочку (что приведет к засорению вывода). Псевдоним оболочки - это не программа, это особенность оболочки, поэтомуstrace
он игнорируется.Бег
strace strace rm
довольно поучителен, а также интересно рекурсивен.источник
Псевдоним - это особенность вашей оболочки. Тем не менее, strace выполняет команду напрямую (используя
execve
, вероятно), что не включает оболочку. (Если strace выполнил данную команду через оболочку, то вывод strace будет содержать все системные вызовы выполнения оболочки, а не только те из интересующего процесса.)Кроме того, когда вы запускаете
strace rm ramesh
, интерактивная оболочка не пытается заменить ваш псевдоним в аргументах на strace, потому что это будет ужасно сбивать с толку всех. Оболочка раскрывает только псевдонимы, которые появляются в первой позиции в командной строке.источник
Strace использует
execve c function
такие, какfind command
, однакоfind uses exec function
вы не можете использоватьaliases
,built-in shell command
или так далее.Ты должен сделать:
источник
Чтобы основываться на ответе Стефана Шазеласа, если вы определите
(с пробелом в конце), затем команда
будет обработан как
Но даже это будет работать только для первого слова после
strace
, поэтому оно не будет применяться непосредственно к вашему примеру (где у вас есть промежуточные варианты). Но если вы определитетогда
будет обработан как
источник
Здесь нет псевдонимов
Давайте предположим, что у нас есть определение псевдонима
alias rm='rm -i'
в нашем~/.bashrc
. Псевдоним добавляет опцию для запроса перед удалением каждого файла:Не вина,
strace
что он не использовал псевдоним:он не имеет ничего общего с псевдонимами.
В команде
Слова
rm
и./file
пока являются просто аргументами для strace - оболочка не может раскрыть псевдонимrm
, потому что не может знать, что strace будет использовать эти аргументы в качестве команды позже.В общем, псевдонимы команд могут использоваться только там, где могут быть команды.
Псевдонимы - это особенность оболочки, и она
strace
вообще не использует оболочку при вызове команды из командной строки.exec()
Вместо этого он использует команды и аргументы из собственной командной строки.Внутри
strace
команда будет вызываться с чем-то похожимexec("rm", "file")
, иexec()
будет найдена/bin/rm
в PATH - без использования оболочки.Явная оболочка
Теперь, почему бы не включить в
strace
команду оболочку ?Хм ... это не сработало.
rm
просто удалил файл, без-i
подсказки.Интерактивные псевдонимы
Псевдонимы обычно включены только в интерактивных оболочках, реальных командных строках в терминале.
С нашим примером псевдонима легко понять, почему это имеет смысл: если
rm -i
псевдоним будет раскрыт внутри сценариев оболочки, они будут висеть в первую очередь,rm
когда никто не будет нажиматьy
.Псевдонимы контролируются опцией оболочки
expand_aliases
. Мы могли бы установить опцию сbash +O expand_aliases -c ...
. Но этого недостаточно, потому что неинтерактивная оболочка также не будет читать~/.bashrc
. Это означает, что наш псевдоним не только отключен опцией, но и даже не определен.Притворяться интерактивным
Простой способ обработки обеих частей - использовать параметр командной строки,
-i
чтобы оболочка притворилась, что она интерактивна:Наконец,
-i
псевдоним был использован!Обратите внимание, что вы обычно не используете оболочки, работающие с
-i
опцией для сценариев, даже если вы хотите, чтобы ваши псевдонимы были доступны, например.источник