投稿

ラベル(shell)が付いた投稿を表示しています

Bash : チルダ展開(tilde expansion)でホームディレクトリパスの指定を簡単に

初めにBashの展開について簡単に Bashでは 展開(expansion) という記法を用いることで、 複数のファイルを一括で指定 ファイル名を編集して指定 別のコマンドの出力を差し込む などといった処理が簡単に出来るようになります。 ワイルドカードを用いた記述 展開に用いられる記法はいくつか種類がありますが、よく使われるのはワイルドカード(*)を使った指定方法ですね。 例えば、 a.txt, b.txt, c.txt, 001.jpg, a002.png の5つのファイルからmvコマンドでtxtファイルだけをtextというフォルダに移動させる場合、 $ mv *.txt text と記述することが出来ます。ここではワイルドカードはパターンマッチングによりテキストファイル名に展開されます。ファイル3つだけなら全てファイル名を記述してもそう大差は無いですが、これがテキストファイル100個とか200個とかになるとワイルドカードを使うなどしないと手間がかかり過ぎてしまうでしょう。 チルダ展開とは さて今回紹介する チルダ展開 ですが、そもそも 「チルダとはなんぞや?」 という説明から始めていきましょう。 チルダとは チルダは英単語では tilde で、発音を区別するために用いられる記号。波ダッシュとも呼ばれています。そして数学やコンピュータ関係ではまた特別な意味を持った記号としても用いられます。 チルダはキーボードから入力すると「~」となります。 チルダ展開 コマンドでチルダを用いると、そのチルダはホームディレクトリのパスとして展開されます。これがチルダ展開。 例えば $ cd ~ とすると、~がホームディレクトリのパスとして展開されるのでこのcdコマンドでホームディレクトリに移動することが出来ます。チルダ展開がどう展開されているのか確かめるなら $ echo ~ とするといいでしょう。この場合は /home/foo と表示されます(fooは任意のユーザー名にでも読み替えて下さい)。 つまりは $ cd ~ $ cd /home/foo は同じことを表していることになるわけです。 チルダ1文字だけでホームディレクトリを指定出来るというのは便利です。 その他、ホームディレ...

seqコマンド : コマンドラインで様々な連番テキストを出力

連番というと 日常生活で「連番」というと宝くじを買う時の指定方法が身近ですね。宝くじと言えばついこの間に年末ジャンボの当選発表がありましたね。当たりましたでしょうか? (私はそもそも年末ジャンボは買っていないのですが😜) 連番とは さてそんな話はさておいて、「連番」とは何かしらの番号が連続しているものです。単純に1ずつ増加していくのが連番としては一般的ですね。さらに何かしらの規則に従って数が並んでいるのが数列。なので連番というのは数列の一種と見なせるでしょう。 簡単な連番の作り方 以下は-10から1ずつ増やして10まで並べた連番。 -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10 これくらいの連番ならキーボードのテンキーを打てばすぐ作れます。 では以下のような1〜300までの連番はどうでしょう?これをキーボードで打って作るとなるとさぞ大変でしょう。作業自体は単純ですが、指先の神経と集中力を持続させることが要求されます。 001,002,003,004,005,006,007,008,009,010,011,012,013,014,015,016,017,018,019,020,021,022,023,024,025,026,027,028,029,030,031,032,033,034,035,036,037,038,039,040,041,042,043,044,045,046,047,048,049,050,051,052,053,054,055,056,057,058,059,060,061,062,063,064,065,066,067,068,069,070,071,072,073,074,075,076,077,078,079,080,081,082,083,084,085,086,087,088,089,090,091,092,093,094,095,096,097,098,099,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,...

Bashでインラインコマンド部分$()を書いている時にタブ補完しようとするとエラーとなってしまう

 タイトルの件、 「Bashでインラインコマンド部分$()を書いている時にタブ補完しようとするとエラーとなってしまう」ですが、まず調べてみた結論から書いておきます。 (ここで「インラインコマンド」って書いちゃってますが、機能としては 「Command substitution」 というものです) 結論  関連するパッケージbash-completionの新しいバージョン (1:2.8-3)でこのバグは修正されているようです。 パッケージがバージョンアップされるのを待つのが無難でしょう。 経緯  Bashで$()を用いてインラインコマンドを書こうとしたとき、タブ補完しようとTabキーを押したらエラーが出てしまいました。どうも$()単独で書いているときはエラーとはならず、 emacs $(echo のように先頭にコマンドを書いてある状態で$()を書いてるときにタブ補完しようとすると起きる模様。 表示されるエラーは以下のようになってました。 $ echo $(bash: unexpected EOF while looking for matching `)' bash: syntax error: unexpected end of file $ emacs $(echo ../bash: eval: line 22: unexpected EOF while looking for matching `)' bash: eval: line 23: syntax error: unexpected end of file bash: eval: line 22: unexpected EOF while looking for matching `)' bash: eval: line 23: syntax error: unexpected end of file 原因を調べるためネットで検索してみる 「bash completion inline command」で検索すると、いくつか関連する情報が見つかりました。 Bash Tab Completion: '-bash: unexpected EOF while looking for matching `)' -bash: synt...

bashでのコマンドライン引数の扱いについて : その1 ワイルドカード(*)の場合

イメージ
前回、bashでのコマンドライン引数を調べるサンプルプログラムを作ってみたので、さっそくこれを使って実際の扱いを調べてみることにしました。 前回のブログ記事↓ コマンドライン引数の扱いがよく分からなかったので調べるためにサンプルプログラムを作成 ワイルドカード(*)について まずコマンドラインでよく使うワイルドカード(*)がどう引数として渡されるのかを調べてみます。 状況 : ディレクトリ内にあるファイルは以下の6つ。 ここでサンプルプログラム(argvtest01.py)を実行 $ python3 argvtest01.py * すると以下のように出力されます。 argv1 = argvtest01.py argv2 = file01.txt argv3 = file02.txt argv4 = file03.txt argv5 = file04.txt argv6 = file05.txt ディレクトリ内にあるファイルのファイル名がそれぞれ別の引数に渡されています。 次にエスケープ文字を前に置いた場合 $ python3 argvtest01.py \* argv1 = * 引数に*(アスタリスク)が文字として渡されています。 シングルクォートで囲んだ場合 $ python3 argvtest01.py '*' argv1 = * これも引数に*が渡されています。 ダブルクォートではどうなるか $ python3 argvtest01.py "*" argv1 = * これも*が渡されています。 ドットを前に置いた場合 $ python3 argvtest01.py .* argv1 = . argv2 = .. となりました。隠しファイルを作っておいた場合はそのファイル名も渡されます。 今回は特に変わったことはしていないので、ほぼ想定通りの結果でした。 ワイルドカードを使う場合、シェルで展開させたい場合とコマンドにワイルドカードを渡してコマンド側で展開などに使いたい場合があるかと思います。そういった場合にどう書けばよいかはこれでだいたい分かるかなと。 また、ダブルクォートで囲んだ場合に展開されるのかどうかがたまに思い出せないこ...

コマンドライン引数の扱いがよく分からなかったので調べるためにサンプルプログラムを作成

コマンドラインからコマンドに引数を渡す際の挙動で、分かり難い状況🤔があったのでそれを調べるためにPythonでサンプルプログラムを作成してみました。 コマンドライン引数の扱いは、通常なら単にスペースで区切られているだけなので特に調べる必要はないんですけどね。ただ、ワイルドカードなどシェル補完がある場合の扱いがどうなるのかはちゃんと調べておきたいところ。それとシングルクォート、ダブルクォートを複数組み合わせて使うような場合とか。 作ったサンプルプログラムは以下に示した通り。 import sys l = len(sys.argv) for i in range(l) : if i == 0: continue print("argv{0} = {1}".format(i, sys.argv[i])) 以上をtest01.pyとして保存して次のようにコマンドライン引数をいくつか渡して実行  $ python3 test01.py test1 test2 test3 すると以下のように1つずつコマンドライン引数が分離されて出力されます。 argv1 = test1 argv2 = test2 argv3 = test3 argv[0]にはスクリプトファイル名が入ってるだけで引数を調べる上では必要ないため、サンプルプログラムではそれは出力されないようにしています とりあえずこれを元にいろいろ調べてみようかなと思います😉 Amazon プログラミング関連書籍など

bashでコメントアウトする方法(1行のみの場合)

イメージ
bashでは行頭に「#」を書くと、その行はコメントとして扱われます。 例えばコマンドラインから $ # test sleep command $ sleep 3 とすると、1行目は行頭に「#」があるのでコメントとして扱われ、2行目だけ実行されます。 また行頭ではなく行の途中に「#」を書くと、行のそれ以降がコメントとして扱われます。 例えば $ date # output current date とすると「date」のみ実行され、「# output current date」はコメントとして扱われることになります。 行の途中に「#」を書く場合の注意点として、「#」の前にスペースを入れないとコメントとして扱われません。 例えば $ echo aaa#bbb と実行すると $ aaa#bbb と出力されます。つまりはスペースを入れないとコマンドや文字列の一部として扱われてしまうことになります。 コメントアウトの使いどころ シェルスクリプトでスクリプトファイルを書いているときは、コメントアウトで簡単にどんな処理をしているのか説明を書いておくと後から見た時に内容がわかりやすくなるでしょう。 コマンドラインにおいては、長い処理の途中までの動作を調べたい場合に途中で区切っておく用途などでしょうか。あとは単にメモとしてコメントを書いておく場合など。 Amazon シェルスクリプト関連書籍など

スポンサーリンク