почему мой скрипт bash не распознает псевдонимы?

<p>в моем <code>~/.bashrc</code> файл находится в двух определениях:</p><ol> <li><code>commanda</code>, который является псевдонимом для более длинного пути</li> <li><code>commandb</code>, который является псевдонимом bash-скрипта</li> </ol><p>я хочу обработать один и тот же файл этими двумя командами, поэтому я написал следующий скрипт bash:</p><hr><pre><code>#!/bin/bash for file in "$@" do commanda $file commandb $file done даже после выхода из сеанса и повторного входа в систему bash предлагает мне command not found ошибки для обеих команд при запуске этого скрипта.что я делаю неправильно?

прежде всего, как сказал ddeimeke, псевдонимы по умолчанию не раскрываются в неинтерактивных оболочках.во-вторых, .bashrc не читается неинтерактивными оболочками, если вы не установите bash_env переменная окружения.но самое главное: не делай этого! пожалуйста? однажды вы переместите этот сценарий куда-нибудь, где не установлены необходимые псевдонимы, и он снова сломается.вместо этого установите и используйте переменные среды как ярлыки в вашем скрипте:#!/bin/bash cmda=/path/to/gizmo cmdb=/path/to/huzzah.sh for file in "$@" do $cmda "$file" $cmdb "$file" done </code></pre>

<p>если вы заглянете на страницу руководства bash, то найдете:</p><blockquote> <p>псевдонимы не раскрываются, когда командная консоль не является интерактивной, кроме случаев, когда параметр shell в расширенном режиме устанавливается с помощью shopt (см. описание shopt в разделе "команды сборки bulltin" ниже).</p> </blockquote><p>так положить</p><pre><code>shopt -s expand\_aliases </code></pre><p>в вашем сценарии.</p><p>убедитесь, что вы установили файл псевдонимов после установки этого в вашем скрипте.</p><pre><code>shopt -s expand\_aliases source ~/.bash\_aliases </code></pre>

<p>псевдонимы нельзя экспортировать, поэтому они недоступны в сценариях оболочки, в которых они не определены. другими словами, если вы определите их в <code>~/.bashrc</code> они недоступны <code>your\_script.sh</code> (если вы не исходите <code>~/.bashrc</code> в сценарии, который я бы не рекомендовал, но есть способы сделать это правильно).</p><p>однако функции можно экспортировать, и они будут доступны для сценариев оболочки, которые запускаются из среды, в которой они определены. это можно сделать, поместив это в ваш bashrc:</p><pre> foo () { echo "hello world!" } export -f foo </pre><p>как говорится в руководстве по bash: "практически для всех целей функции shell предпочтительнее псевдонимов".</p>

<pre><code>[cmd line] > bash -i [your script's file path] </code></pre><p><code>i</code> предназначен для интерактивной работы и является источником вашего профиля <code>bash</code>.</p>