9
票
8
票
承認済み
bashにハイフン1つのコマンド「bash -」の意味を教えてください
この場合、- は何もしません。無意味な引数です。
BashなどのBourne系シェルにおいて - は -- と同じです。以降の引数が - で始まっていてもオプション(フラグ)として扱わないことを示します。
質問のコマンドの場合、以降に引数がありませんから、引数が無いのと同じです。(引数が無い場合、bash は標準入力からコマンド列を読み込み、それを実行します)
参考:
-- ...
7
票
承認済み
複数コマンドを同一行で & や && で繋いだときの挙動を知りたい
&& は論理積で「左辺のコマンドが正常終了した場合のみ、右辺のコマンドを実行する」です。
よくある例は、./configure が成功した時のみ make を実行する、など。
$ ./configure && make && make install
7
票
複数コマンドを同一行で & や && で繋いだときの挙動を知りたい
command1 & command2
のほうは
command1 &
command2
と同じ挙動になります。
command1がバックグラウンド実行される結果、command1とcommand2が同時に実行されることになります。
7
票
bashでのループ処理は波括弧で囲んでも動く?
実装経緯までは分かりませんでしたが、たしかに Bash の実装を見る限り for に限ってこの構文が許されていました: https://git.savannah.gnu.org/cgit/bash.git/tree/parse.y?id=9439ce094c9aa7557a9d53ac7b412a23aa66e36b#n805
for_command: FOR WORD ...
6
票
rm -f file と rm file || true に差はある?
file が無いとき
- rm -f file は無言で終了し終了コード 0
- rm file || true は「ファイルがありません」のメッセージを stderr に出し終了コード 0
ディレクトリ hoge の下にファイル piyo があって cd hoge してあるものとして
hoge の権限が rwx (ディレクトリ自体には書き込み許可)
piyo の権限が r-- (...
6
票
承認済み
6
票
承認済み
bashでファイルの最後からxxx行目に行を追加したい
echoではできないと思います。
sedを使うとよいでしょう。
file='/tmp/test/test.text'
#ファイルの最後からxx行目の行番号を取得
line_num=$(grep -c ^ $file)
row_num=$((line_num - xx))
#指定行に挿入
sed -i ''$row_num'i test' $file
細かなところは以下を参考にしました。
...
6
票
承認済み
grepの引数として$記号を渡す際のエスケープについて
質問冒頭
bashで正規表現
という表現がそもそもの問題がどこにあるかを正しく理解できていないことを示しています。bashももちろん正規表現を扱うことがありますが、今回は無関係です。
今回、bashはgrepという外部プログラムを起動するだけです。
grepとしても$は行末を表すメタ文字ですので、この機能をキャンセルするためには\でエスケープする必要があります。...
6
票
承認済み
BashとDashでechoのエスケープシーケンスに対する挙動が異なるのは何故?
歴史
もともとechoはどのようなオプションもエスケープシーケンスも解釈せず、ただ引数を標準出力に渡すだけの単純なものでした。Version 6 Unixのecho.cにはforループとprintfしかありません。V6は1975年にリリースされています。
https://www.in-ulm.de/~mascheck/various/echo+printf/
About the ...
6
票
承認済み
vimのカラースキームに関して
手元でも再現出来ました。
みたところWindowsのコマンドプロンプトのバグっぽいです。
対策としては、
wsltty 等の別の(まともな)端末エミュレータを使う
標準のコンソール(コマンドプロンプト)を使うならば、以下の設定を .vimrc に追加する
set t_ut=
の二つが考えられます。
6
票
tr -d '\n' を実行しても改行を削除できない問題
歴史的事情というやつにより、改行コードには CR と LF と CR+LF の3種類があります。
\r は CR
\n は LF
tr はバイト単位で操作しますので tr -d '\n' は LF のみ削除することになります。一方で Windows / MacOS / Unix クロスプラットフォームなツールは3種類の改行をどれでも受け付けるものがあります。もともと Windows で作成した ...
6
票
Linuxのコマンドラインで echo * を実行するとファイル一覧が表示されるのはなぜ?
いや単に POSIX shell (bash, dash, csh) のコマンドラインにおいては * は shell glob として解釈されるだけの話。 man bash 起動するコマンドが echo だろうが ls だろうが cat だろうが全部同じ挙動をします。
そうなった根拠とか理由とかは英語では rationale という単語になるでしょうが、もしあるとしたら POSIX の(...
6
票
承認済み
cronファイルに、長いコマンドを複数行にまたがって書きたい。
本家Stack OverflowやUnix & Linux StackExchangeにほとんど同じ趣旨の質問があるようです。
linux - Crontab Command Separate Line - Stack Overflow
How come I can't use \ to continue a line in crontab? - Unix & Linux ...
5
票
承認済み
shとbashについて
sh というと伝統的なB-Shellのことをイメージしますが、ご質問のCentOS環境では sh と bash は同じコマンドです。/bin/sh は /bin/bash のシンボリックリンクなので sh といいならがらも bash が動きます。
Q1.bashはshの上位互換ですか?
・shでは出来るけれども、bashでは出来ないことはありますか?
こちらについてはわかりません(...
5
票
承認済み
リモートシェルでローカルシェルの変数を参照したい
fumiyas さんもおっしゃっていますが、 sed と ssh 組み合わせてやろうとすると、いくつか制御文字が使われた場合などで、バグが発生しています。まず具体例から。
質問者さんがやりたいことは、 world -> hello であるならば、ひとまず以下で達成できます。
: ${SSH_TO:=host}
TARGET_FILE=/home/ec2-user/test.txt
...
5
票
承認済み
'¥'記号をtrを使って'/'に変換すると、bashで警告が出るのはなぜですか
\がエスケープ文字として認識されているからです。
echo 'C:\program\hoge' | tr '\\' '/'という風に\を\でエスケープすればエラーが出なくなります。
5
票
xargsの-Iオプションが機能しなくなる時がある
macOSのxargsでは、-Iオプションで置換した後の文字列は255bytesが上限のようです。
man xargs によれば以下の通り。
I replstr
Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements ...
5
票
承認済み
bashの「レントジョブ」とは何を意味するのでしょうか
$ LC_ALL=C help fg
とすると英語でヘルプが表示されますが、これによると
If JOB_SPEC is not present, the shell's notion of the current job is used.
となっていますのでオイラ流に翻訳すると「シェルがカレントジョブと思っているものが使われます」となり、単純に翻訳の際の誤記ですね。 s/レント/カレント/
5
票
承認済み
行頭にある >&2 の意味(docker-composeによるコンテナ起動順制御に使用)
コマンドの前に書かれた >&2 も標準エラー出力にリダイレクトするという意味です。シェルスクリプトのログをエラー出力に流すために使われています。
Bash のマニュアル 3.6 Redirections に次のとおり書かれています。
The following redirection operators may precede or appear anywhere within ...
5
票
承認済み
`/bin/bash ./hoge.sh > out1.txt 2>&1`では、`bash -x`の結果がファイルに出力されませんでした。なぜでしょうか?
シェバンを解釈するのはexecveのようです。
シバン (Unix)出典: フリー百科事典『ウィキペディア(Wikipedia)の補足を参照のこと
/bin/bash ./hoge.shではexecveを呼び出されず、-xが効いていません。
straceで調べてみましたがやはり、execveでhoge.shになり替わっていませんでした。
/bin/bash ./hoge.shはhoge....
5
票
承認済み
シェルスクリプトからのコマンド実行でエラー: そのようなファイルやディレクトリはありません
この場合クォートは余計な気がします。クォート無しだとどうでしょうか。
/usr/bin/pg_ctl start -D /data/pgsql
5
票
承認済み
「ディレクトリ内のファイル名がすべて等しい」の判定をLinuxで行う
diffコマンドの-qオプションを使うことで、ファイルの中身を見ずにファイル名の差分のみ比較できます。
ちなみにサンプルコードの-rオプションはサブディレクトリを再帰的に確認するオプションです。
MYVAR=`diff -qr a b`
[[ -z "$MYVAR" ]] && echo "合ってます" || echo "違います&...
4
票
承認済み
bashのリスト中に改行を入れても、マニュアルの文法仕様に沿っている?
Listの定義のうち、質問で引用されている部分の後に、以下の記述があります。
A sequence of one or more newlines may appear in a list instead of a semicolon to delimit commands.
4
票
リモートシェルでローカルシェルの変数を参照したい
sshでリモート側にローカルの環境変数を渡すためには双方に設定が必要です。
ローカル側
.ssh/config(または/etc/sshd/ssh_config)に環境変数を送信する設定
SendEnv string
リモート側
/etc/ssh/sshd_configにローカル側が送ってきた環境変数を受け入れる設定
AcceptEnv string
また、...
4
票
承認済み
MySQLのport番号をシェルスクリプトの関数内で指定する方法
3行目のechoコマンドを query() の中に移動してみれば原因がわかると思います。
関数内の $1 $2 等は、関数外の値を引き継ぎません。関数呼び出し時に与えられた引数になります。
今回のスクリプトの場合は $1 は "begin;~" の文字列になり、$2 は空になります。
4
票
bashの特殊変数への代入にエラー
#!/bin/bash
echo $2
echo ${2}
N=2
echo ${!N}
とすることで、
% ./sample.sh foo bar
bar
bar
bar
が実現できます。
4
票
承認済み
4
票
ネストしたシェルスクリプトのエスケープ方法
無理してエスケープせずにheredocを /bin/bash に食わせてはどうですか。
/bin/bash -l -- <<'EOF'
for e in $(conda env list | grep mlflow | awk '{ print $1 }')
do
echo "conda env remove -n $e"
conda env remove -n $e
...
4
票
承認済み
シェルスクリプト内のエイリアスコマンドを実行したい
1行でまとめて実行するか、
$ BASH_ENV=~/.bash_aliases bash -O expand_aliases ~/bin/rootls.sh
export で環境変数 BASH_ENV を設定してから実行してみてください。
$ export BASH_ENV=~/.bash_aliases
$ bash -O expand_aliases ~/bin/rootls.sh
...
無効化に投票