почему strace игнорирует мой псевдоним для rm?

У меня есть 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 к процессу, который не находится в выходе ps?
  • Почему «w» здесь требует больше системных вызовов, чем простой скрипт python?
  • Самый изящный способ прекратить навязчивую программу
  • Почему я не могу подключить `strace` к процессу kworker?
  • RHEL: не может использовать утилиту ipset с ошибкой: не удается открыть сеанс для ядра
  • Выход Grepping strace становится тяжелым
  • Использование strace для файла C
  • Можно ли привязать встроенные команды к Bash?
  • 6 Solutions collect form web for “почему strace игнорирует мой псевдоним для rm?”

    strace не работает rm -i по той же причине, что и:

     echo rm 

    не выводит rm -i .

    Псевдонимы – это функция нескольких оболочек, позволяющая некоторым строкам автоматически заменяться на другую, когда она находится в командной позиции.

    В:

     alias foo='whatever' foo xxx 

    Оболочки расширяют это:

     whatever xxx 

    и в этом случае происходит еще один раунд интерпретации, в этом случае приводящий к выполнению whatever команды.

    псевдонимы расширяются только тогда, когда они находятся в командной позиции (в качестве первого слова командной строки).

    zsh поддерживает глобальные псевдонимы.

    Вы можете сделать:

     alias -g rm='rm -i' 

    Но вы не захотите, потому что это будет означать:

     echo rm 

    например, выводит rm -i .

    strace использует PATH среды 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 /bin/rm -i ramesh 

    Чтобы построить ответ Стефана Хазеласа, если вы определите

     alias strace="strace " 

    (с пробелом в конце), то команда

     strace rm ramesh 

    будут обрабатываться как

     strace rm -i ramesh 

    Но даже это будет работать только для первого слова после strace , поэтому оно не будет применяться непосредственно к вашему примеру (где у вас есть промежуточные варианты). Но если вы определите

     alias my_strace="strace -ff -e trace=file " 

    тогда

     my_strace rm ramesh 

    будут обрабатываться как

     strace -ff -e trace=file rm -i ramesh 

    Нет псевдонимов здесь

    Предположим, у нас есть псевдоним определения alias rm='rm -i' в нашем ~/.bashrc . Псевдоним добавляет параметр для запроса перед удалением каждого файла:

     $ touch ./file $ rm ./file /bin/rm: remove regular empty file './file'? 

    Это не ошибка strace что он не использовал псевдоним:
    Это не имеет ничего общего с псевдонимами.

    В команде

     $ strace -f -e file -o rm.strace rm ./file 

    Слова rm и ./file являются аргументами для strace – оболочка не может расширять псевдоним rm , потому что не может знать, что strace будет использовать эти аргументы как команду позже.

    В общем случае псевдонимы команд могут использоваться только там, где могут быть команды.

    Псевдонимы – это свойство оболочки, и strace вообще не использует оболочку при вызове команды из командной строки. Вместо этого он использует exec() , с командами и аргументами из собственной командной строки.

    Внутри strace команда будет вызвана с чем-то похожим на exec("rm", "file") , а exec() найдет /bin/rm в PATH – без использования оболочки.

    Явная оболочка

    Итак, почему бы не включить оболочку в команду strace ?

     $ touch ./file $ strace -f -e file -o rm.strace bash -c 'rm ./file' $ ls ./file ls: cannot access ./file: No such file or directory 

    Хм … это не сработало. rm просто удалил файл без подсказки -i .

    Интерактивные псевдонимы

    Псевдонимы обычно включаются только в интерактивные оболочки, фактические командные строки в терминале.
    С нашим псевдонимом примера легко понять, почему это имеет смысл: если псевдоним rm -i будет расширяться внутри сценариев оболочки, они будут висеть на первом rm и никто не будет там для нажатия y .

    Псевдонимы контролируются опцией оболочки expand_aliases . Мы могли бы установить параметр с помощью bash +O expand_aliases -c ... Но этого недостаточно, потому что неинтерактивная оболочка также не будет читать ~/.bashrc . Это означает, что наш псевдоним не только отключен опцией, но и даже не определен.

    Притворяясь интерактивным

    Легкий способ обработки обеих частей – использовать параметр командной строки -i чтобы заставить оболочку притворяться интерактивной:

     $ touch ./file $ strace -f -e file -o rm.strace bash -i -c 'rm ./file' /bin/rm: remove regular empty file './file'? 

    Наконец, был использован псевдоним -i !

    Обратите внимание, что обычно вы не используете оболочки, работающие с параметром -i для сценариев, даже если вы хотите, чтобы ваши псевдонимы были доступны, например.

    Interesting Posts

    Как сделать принтер, добавленный через CUPS, отображаться в списке принтеров по умолчанию в Centos

    Удалить GNOME и установить dwm

    Как добавить несколько строк в файл без последней новой строки?

    Выполнять команду или функцию, когда SIGINT или SIGTERM отправляются самому родительскому скрипту, а не дочерним процессам

    yum не работает на RHEL 6.3

    Как долго длится ssh-соединение?

    Как исправить предупреждение об ошибке не удалось подключиться к lvmetad, нет такого файла или каталога, возвращающегося к внутреннему сканированию в ubuntu 15.10

    rxvt-unicode + mc – странные символы только в корневой оболочке

    Могу ли я ограничить процесс определенным количеством циклов времени / ЦП?

    удалять файлы на основе diff двух текстовых файлов

    Настройка WiFi на Debian7 для беспроводной карты N-2230 Intel

    Как выбрать имя каталога во время распаковки

    Как скрывать меню загрузки grub, если не нажимать shift?

    Исправить вход аудио Skype в Mint 17 Cinnamon

    AppArmor: Возможно ли использование нескольких профилей для одного приложения (Firefox, Thunderbird)? Синтаксис?

    Linux и Unix - лучшая ОС в мире.