MySQLシェル内のシェルコマンドは値を返します:
mysql> \! echo 1
1
この結果をMySQL変数に割り当てる方法は?好き:
mysql> set @var = \! echo 1
1
-> ;
エラー1064(42000):SQL構文にエラーがあります。1行目の''の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。
問題はSET
、サーバーに保持されている変数の状態を変更するサーバーコマンドです。一方system
(およびその\!
省略形)はクライアントコマンドであり、クライアント上でプロセスをフォークします。クライアントがフォークされたプロセスの終了コードをサーバーに送信してユーザー変数に格納することは可能かもしれませんが、MySQLコマンドラインクライアントがこの機能を提供しているとは思いません。
差出人mysql-5.5.29/client/mysql.cc
:
3958: static int
3959: com_shell(String *buffer __attribute__((unused)),
3960: char *line __attribute__((unused)))
3961: {
3962: char *shell_cmd;
3963:
3964: /* Skip space from line begin */
3965: while (my_isspace(charset_info, *line))
3966: line++;
3967: if (!(shell_cmd = strchr(line, ' ')))
3968: {
3969: put_info("Usage: \\! shell-command", INFO_ERROR);
3970: return -1;
3971: }
3972: /*
3973: The output of the shell command does not
3974: get directed to the pager or the outfile
3975: */
3976: if (system(shell_cmd) == -1)
3977: {
3978: put_info(strerror(errno), INFO_ERROR, errno);
3979: return -1;
3980: }
3981: return 0;
3982: }
特に、system(3)
呼び出しの戻り値はどこにも格納されないことに注意してください。ただし、プロセスがそのコードで終了した場合、com_shell()
関数呼び出しは返されます。-1