コンソール:変数、エイリアス、マクロ、ヒストリー

$Date: 2023/07/06 20:22:18 $

概要

コンソールからのコマンド入力を補助する機能として、変数、エイリアス、マクロ、ヒストリー機能が利用できます。変数、エイリアス、マクロを利用すると、長いコマンドの入力を簡略化したり、複数のコマンドを一度に実行することができます。ヒストリーを利用すると、過去に入力したコマンドを簡単に呼び出せるようになります。

また、変数はLuaスクリプトから環境変数として利用することができます。


対応機種とファームウェアリビジョン

ヤマハルーターでは以下の機種およびファームウェアで、変数、エイリアス、マクロ、ヒストリー機能をサポートしています。

機種ファームウェア
vRX VMware ESXi版すべてのリビジョン
vRX Amazon EC2版
RTX3510
RTX1300
RTX1220
RTX830Rev.15.02.03以降
NVR510Rev.15.01.13以降
NVR700WRev.15.00.14以降
RTX1210Rev.14.01.26以降
RTX5000Rev.14.00.26以降
RTX3500

変数

setコマンドで変数に設定した値を、その後のコマンドで利用することができます。コマンド中に何度も同じ値が出てくる場合、それを変数にまとめておくことでコマンドの入力を簡単にすることができます。

変数は$の後に変数名を記述することで呼び出せます。例えば変数VARを呼び出すためには、$VARと記述します。後続の文字列と明確に分離する必要がある場合には、${VAR}のようにブレースで変数名を囲みます。

$の後ろにある文字列が変数として定義されていない文字列の場合には、文字列の展開は行われず、$を含め、もともとの文字列が保持されます。

# set NET=192.168.10
# ip route $NET.1 gateway 10.10.10.1     ⇒ ip route 192.168.10.1 gateway 10.10.10.1
# pp select 1
#  pp auth myname userid Passwd$NETx     ⇒ pp auth myname userid Passwd$NETx   (NETxという変数は定義されていないので'$NETx'は変換されない)
    

また、他の変数の定義の中で、${{VAR}}とブレースを二重にして記述した場合、変数VARが展開されるのはsetコマンド実行時ではなく、定義された変数が展開されるときになります。この展開は再帰的に定義できますが、無限ループを防ぐために再帰の深さを最大10に制限しています。最大の深さは変数MAX_VAREXP_RECURSIVEで変更できます。

二重ブレースによる変数定義は、他の変数の内容を引用するときに便利です。

# set NET=192.168.10
# set HOST1=${NET}.1                     ⇒ set HOST1=192.168.10.1
# set HOST2=${{NET}}.1                   ⇒ set HOST2=${NET}.1
# ip route $HOST1 gateway 10.10.10.1     ⇒ ip route 192.168.10.1 gateway 10.10.10.1
# ip route $HOST2 gateway 10.10.10.1     ⇒ ip route 192.168.10.1 gateway 10.10.10.1
# set NET=10.20.30
# ip route $HOST1 gateway 10.10.10.1     ⇒ ip route 192.168.10.1 gateway 10.10.10.1
# ip route $HOST2 gateway 10.10.10.1     ⇒ ip route 10.20.30.1 gateway 10.10.10.1
    

変数名には、半角文字の英大文字、英小文字、数字、アンダースコア(_)が使用できます。英大文字、英小文字は区別されます。setコマンドで設定する変数は必ず英文字で始まらなければいけません。

変数は、すべてのコンソールで共通で管理されます。変数はLuaスクリプトからも、os.getenv関数により環境変数として利用することができます。また、一部の変数はLuaスクリプト機能などの動作に影響を与えます。

LUA_INIT Luaスクリプト開始時に事前に実行させるスクリプト
LUA_PATH require関数がLuaモジュールをロードするために使用するパス
PWD ファイルを指定するコマンドにおいて、相対パスの起点となるパス
MAX_VAREXP_RECURSIVE 変数の再帰展開の最大の深さ。変数未設定時は10
MAX_MACRO_RECURSIVE マクロの再帰呼び出しの最大の深さ。変数未設定時は10
HISTSIZE ヒストリーの保存数。変数未設定時は50

エイリアス、マクロ

コマンド行の先頭に@がある場合、続く文字列をエイリアスあるいはマクロとして展開します。エイリアスはaliasコマンドで設定した文字列にエイリアスを置き換えます。マクロは、macroコマンドで設定した複数のコマンドを順次実行していきます。

callコマンドによりRTFSや外部メモリーに保存したファイルをマクロとして呼び出すこともできます。エイリアスとマクロは、すべてのコンソールで共通で管理されます。

エイリアスとマクロの名前には、半角文字の英大文字、英小文字、数字、アンダースコア(_)が使用できます。英大文字、英小文字は区別されます。同じ名前のエイリアスとマクロがある場合、エイリアスの方が優先されて展開されます。

マクロの呼び出しでは、引数を与えることができます。引数はマクロ内でのみ有効な変数として機能します。マクロ引数には以下の2種類があります。

名前付き引数 NAME=VALUEの形で引数を指定すると、マクロ内では値VALUEを持つ変数NAMEを利用できます。
位置引数 名前付き引数以外の引数は、位置引数として、$の後に数字を続けることでマクロ内で利用できます。先頭の引数は$1、2番目は$2となり、コマンドとして入力できる限りいくつでも指定できます。$0はマクロ名(@によるマクロ展開の場合)またはファイル名(callコマンドの場合)です。$*$1から最後の位置引数までを空白を挟んで連結した文字列となります。
# alias s="show ip route"
# @s                                     ⇒ show ip route
# @s summary                             ⇒ show ip route summary
# @s detail                              ⇒ show ip route detail
# macro m <<EOM
echo Called macro "'$0'" with argument $*
ip route $1.0/25 gateway $2
ip route $1.128/25 gateway $3
EOM
# @m 192.168.10 10.10.10.1 10.20.20.2    ⇒ 以下のコマンドを順次実行
                                         ⇒ echo Called macro "'m'" with argument 192.168.10 10.10.10.1 10.20.20.2
                                         ⇒ ip route 192.168.10.0/25 gateway 10.10.10.1
                                         ⇒ ip route 192.168.10.128/25 gateway 10.20.20.2

# macro m2 <<EOM
ip route $NET.0/25 gateway $1
ip route $NET.128/25 gateway $2
EOM
# @m2 10.10.10.1 10.20.20.2 NET=192.168.10    ⇒ 以下のコマンドを順次実行
                                         ⇒ ip route 192.168.10.0/25 gateway 10.10.10.1
                                         ⇒ ip route 192.168.10.128/25 gateway 10.20.20.2

# call /file.mac 192.168.10 10.10.10.1   ⇒ ファイル"/file.mac"をマクロとして呼び出す
    

マクロの中で他のマクロを呼び出すこともできますが、無限ループを防ぐために再帰の深さを最大10に制限しています。最大の深さは、変数MAX_MACRO_RECURSIVEで変更できます。エイリアスから他のエイリアスやマクロを呼び出すことはできません。

# macro loop <<EOM
echo loop
@loop
EOM
# @loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
Error: Too depth macro call
# set MAX_MACRO_RECURSIVE=3
# @loop
loop
loop
Error: Too depth macro call
#
    

ヒストリー

対話的コンソール(シリアル、TELNET、SSH等)では、過去に入力されたコマンドをヒストリーとして参照、再利用することが可能です。

ヒストリーは、上下の矢印キーで呼び出せます。上矢印(↑)キーで一つずつ過去にさかのぼりながらヒストリーを呼び出せます。下矢印(↓)キーでは元に戻ります。

また、コマンド行の先頭に以下の記号を入力すると、ヒストリー参照となります。

!! 直前のコマンドが参照されます。
!n nで示される番号のコマンドが参照されます。番号はshow command historyコマンドで確認できます。
!-n 現在のコマンド行からnで示される番号だけ前のコマンドが参照されます。!-1は直前のコマンドであり、!!と同じです。!-2は2つ前のコマンドになります。
!str
!{str}
strで始まるコマンドのうち、一番最近入力されたコマンドが参照されます。{ }を使う記法の場合は、strに空白文字を含めることができます。strでは変数やエイリアスの展開は行われません。
# show ip
Error: Invalid command name
# !! route
show ip route
  :
  :
# !-2 connection
show ip connection
  :
  :
# show command history
    1  2018/01/01 08:00:00  administrator
    2  2018/01/01 08:00:10  show ip
    3  2018/01/01 08:00:20  show ip route
    4  2018/01/01 08:00:30  show ip connection
# !1
administrator
Error: You are administrator
#!2v6 route
show ipv6 route
  :
  :
# !show
show ipv6 route
  :
  :
    

参照されたコマンドは、置き換えの前に修正することができます。ヒストリー参照の直後に:s/BEFORE/AFTER/または:gs/BEFORE/AFTER/を置くと、ヒストリー中の文字列BEFOREAFTERに置き換えられます。sの場合は置き換えは最初の一回だけ行われ、gsの場合は見つかったすべての文字列に対して置き換えが行われます。置き換え指示は複数列挙することができます。

置き換え指示の区切り文字である/には、空白、TAB、バックスラッシュ(\)を除く他の半角文字も利用でき、sgsの直後の文字が区切り文字として使用されます。また、最後の区切り文字は省略することができます。

# show ip route
  :
  :
# !!:s/ip/ipv6/
show ipv6 route
  :
  :
# !!:s|ipv6|ip|
show ip route
  :
  :
    

ヒストリーは最大50件保存されます。この値は変数HISTSIZEで変更できます。ヒストリーは対話型コンソールごとに管理され、同時にログインしている他のコンソールとは共有されません。また、ヒストリーはコンソールからログアウトしたときにすべて削除され、次回のログイン時には引き継がれません。


コマンド

変数の設定

[書式]
set NAME=VALUE
no set NAME[=VALUE]
[設定値]
NAME ... 変数名
VALUE ... 値となる文字列
[説明]
変数を設定する。

NAMEに使用できる文字は、英大文字、英小文字、数字、アンダースコア(_)のみで、先頭は必ず英文字でなければならない。VALUEに空白等の特殊文字を含む場合は、VALUE全体を引用符で囲む必要がある。

変数の表示

[書式]
show set [NAME]
[設定値]
NAME ... 変数名
[説明]
指定した変数の値を表示する。NAMEを省略した場合には、設定されている変数をすべて表示する。
[表示例]

# set A=123
# set NET=192.168.10
# set TEST="This is a test"
# show set
A='123'
NET='192.168.10'
TEST='This is a test'
#
	

エイリアスの設定

[書式]
alias NAME=VALUE
no alias NAME[=VALUE]
[設定値]
NAME ... エイリアス名
VALUE ... 値となる文字列
[説明]
エイリアスを設定する。

NAMEに使用できる文字は、英大文字、英小文字、数字、アンダースコア(_)のみで、先頭は必ず英文字でなければならない。VALUEに空白等の特殊文字を含む場合は、VALUE全体を引用符で囲む必要がある。

エイリアスの表示

[書式]
show alias [NAME]
[設定値]
NAME ... エイリアス名
[説明]
指定したエイリアスの値を表示する。NAMEを省略した場合には、設定されているエイリアスをすべて表示する。
[表示例]

# alias s='show ip route'
# alias e='exit'
# show alias
e='exit'
s='show ip route'
#
	

マクロの設定

[書式]
macro [-v] [-x] NAME <<EOM
no macro [-v] [-x] NAME [<<EOM]
[設定値]
NAME ... マクロ名
EOM ... マクロの終端文字列
[説明]
マクロを設定する。

このコマンド入力後、マクロ入力状態になるので、マクロの内容を入力していく。マクロの最後には、EOMで指定した終端文字列だけを入力すれば、マクロ入力が終了する。マクロ入力中でも、Ctrl-Cを入力すればコマンドを中断できる。

[設定例(下線部がユーザーの入力内容)]

# macro m <<EOM
show ip route
show ip connection
EOM
#
	

-vオプションを指定すると、マクロを実行するときに、実行する各行について、変数とエイリアスの展開前の内容を表示しながら実行する。-xオプションは、変数とエイリアスを展開した後の行を表示しながらマクロを実行する。

NAMEに使用できる文字は、半角の英大文字、英小文字、数字、アンダースコア(_)のみで、先頭は必ず英文字でなければならない。

[ノート]
複数行からなるコマンドに対応していないため、schedule atコマンドでは実行できない。

Luaスクリプトrt.command()で複数行からなるコマンドを実行する場合には、各行を改行文字('\n')で連結した文字列をコマンドとして渡す。改行文字は'\n'でなくてはならず、'\r''\r\n'ではエラーとなる。

rtn, err = rt.command("macro x <<EOM\necho This is x\nEOM")
	

マクロの表示

[書式]
show macro [NAME]
[設定値]
NAME ... マクロ名
[説明]
指定したマクロの値を表示する。NAMEを省略した場合には、設定されているマクロをすべて表示する。
[表示例(下線部がユーザーの入力内容)]

# macro m <<EOM
show ip route
show ip connection
EOM
# macro m6 <<EOM
show ipv6 route
EOM
#
# show macro
macro m <<EOM
show ip route
show ip connection
EOM
macro m6 <<EOM
show ipv6 route
EOM
#
	

ファイルをマクロとして実行する

[書式]
call [-v] [-x] FILENAME [PARAMETER...]
[設定値]
FILENAME ... ファイル名
PARAMETER ... マクロ引数
[説明]
FILENAMEで指定したファイルをマクロとして実行する。

マクロには引数を渡すことができる。引数が、NAME=VALUEの形をしている場合、マクロ内では変数NAMEとしてVALUEを参照できる。他の形の引数は位置引数として、指定された順番に、$1、$2等でアクセスできる。$0はファイル名、$*はすべての位置引数を空白で結合した文字列となる。引数はすべてマクロ内でのみ利用可能な変数である。

-vオプションを指定すると、マクロを実行するときに、実行する各行について、変数とエイリアスの展開前の内容を表示しながら実行する。-xオプションは、変数とエイリアスを展開した後の行を表示しながらマクロを実行する。

文字列の表示

[書式]
echo [STRING...]
[設定値]
STRING ... 表示したい文字列
[説明]
指定された文字列を表示する。
[表示例]

# echo Hello World
Hello World
# set A=123
# echo $A
123
#
	

コマンドヒストリーの表示

[書式]
show command history [NUM]
[設定値]
NUM ... ヒストリー番号 (1 .. 2147483647)
[説明]
コマンドヒストリーを表示する。

NUMを指定した場合は、指定した番号のコマンドから直前のコマンドまで表示する。NUMを省略した場合には、新しいものからさかのぼって最大20個のコマンドを表示する。

[表示例]

# show command history
    1  2018/01/01 08:00:00  administrator
    2  2018/01/01 08:00:10  show ip route
    3  2018/01/01 08:00:20  show ip connection
    4  2018/01/01 08:00:30  ip route 192.168.10.1
#
	

参考情報