Запустіть іншу команду перед тим, як запустити команду, яку користувач хоче виконати


9

Скажімо, я хочу змінити оригінальну поведінку lsінструменту таким чином:

$ ls
Hello World
file1 file2 ...

Як я можу це зробити?

Під час запуску lsя хотів би запустити ще одну команду, скажімо echo "Hello World!".

Яке швидке рішення, як я бачу, використовує псевдонім:

alias orig_ls="ls"
alias ls='echo "Hello World!"'

Однак це не є реальним рішенням, оскільки коли я його запускатиму, orig_lsто вийде "Hello World!".


Помістіть інший власний шлях у користувачів і використовуйте це, щоб підключити оригінал.
peterh

Відповіді:


12

Іноді псевдонім недостатньо потужний, щоб легко робити те, що ви хочете, тому ось спосіб, не використовуючи їх.

У якийсь файл, який з’являється при запуску оболонки (наприклад .bashrc), додайте таку функцію:

ls () {
    echo "Hello world!"
    command ls "$@"
}

На відміну від псевдоніма, функція може повторюватися. Ось чому command lsвикористовується замість ls; він повідомляє вашій оболонці використовувати фактичне lsзамість визначеної вами функції.


2
Справді. Це рішення краще масштабується. +1
PythonNut

Яка commandальтернатива OS X?
Ionică Bizău

@ IonicăBizău Я поняття commandне працював: / Я поняття не маю, і у мене немає Mac, з яким би це перевірити, вибачте.
підземниймонорельс

9

Ви не повинні забути зателефонувати ls:

alias ls='echo "Hello World!"; ls'

Га! Я гадав, це створить нескінченний цикл! Але чому це не створює нескінченний цикл?
Ionică Bizău

1
Ви можете замість цього спробувати псевдонім ls 'echo "Hello World!"; / usr / bin / ls '
jamesqf

5
@ IonicăBizău будь-яке задане "правило псевдоніму розширення" використовується лише один раз.
David Z

Чи приєдналося б двоє до & також працювати? Це також би гарантувало, що команда користувача запускається лише у тому випадку, якщо користувацька працює, чи не так?
Фонд позову Моніки

@QPaysTaxes Ви можете використовувати &справді, але я не отримую аргументу, який ви робите з цього.
Hauke ​​Laging
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.